【问题标题】:Divide an array into Three parts (Recursion) [closed]将数组分成三部分(递归)[关闭]
【发布时间】:2015-06-25 07:45:03
【问题描述】:

问题链接:

https://www.hackerearth.com/problem/algorithm/divide-to-three-33/description/

我能够使用动态编程来解决它。 https://www.hackerearth.com/submission/1720148/

谁能解释一下编辑解决方案(递归)。

编辑解决方案:

#include<cstdio>
#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
#include<iostream>
#include<string>
#include<algorithm>
#include<fstream>
#include<sstream>
using namespace std;
typedef long long int int64;
int64 n,a[40],ans,vl;
void fn(int64 i,int64 j,int64 k,int64 ptr){
    if(ptr==n){
        vl = max(max(i,j),k);if(vl<ans)ans=vl;
    }
    else{
        fn(i+a[ptr],j,k,ptr+1);
        fn(i,j+a[ptr],k,ptr+1);
        fn(i,j,k+a[ptr],ptr+1); 
    }
}
int main(){
//freopen("in3.txt","r",stdin);
//freopen("out3.txt","w",stdout);
    int64 i,j,k,l,m,t,vl,fl;ans=1000000;
    cin>>n;for(i=0;i<n;i++)cin>>a[i];
    fn(0,0,0,0);
    printf("%lld\n",ans);

    return 0;
}

谢谢,

【问题讨论】:

  • 我不明白为什么这个问题是-2。我已经努力使用动态编程来解决这个问题。我无法理解递归解决方案。我想理解它,因为它非常接近代码。
  • @Marco Bonelli ...已编辑问题

标签: c++ arrays recursion dynamic-programming partition


【解决方案1】:

想法很简单,你可以将一个元素添加到三个集合中的任何一个(S1 或 S2 或 S3)。使用函数fn,编码器基本上是这样做的。寻找一个表示为ny ptr的元素(元素是a[ptr]),它要么添加到第一个(i),第二个(j)或最后一个( k)。其中的最大值作为输出给出。

实际上,将元素添加到三个集合中的任何一个的所有可能性都通过这三行检查

    fn(i+a[ptr],j,k,ptr+1);
    fn(i,j+a[ptr],k,ptr+1);
    fn(i,j,k+a[ptr],ptr+1);

基本条件显然是当我们检查完数组中的所有元素时

if(ptr==n){
    vl = max(max(i,j),k);if(vl<ans)ans=vl;
    }

三个集合和的最大值在max(max(i,j),k)中找到。

现在if(vl&lt;min) 将确定满足条件的最小S1。这就是为什么这个检查是v1&lt;ans,我们会尽量减少S1

这里 i,j,k 表示对应集合的总和。

【讨论】:

  • 非常感谢@amalsom
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多