Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将数组分成三部分(递归)_C++_Arrays_Recursion_Dynamic Programming_Partition - Fatal编程技术网

C++ 将数组分成三部分(递归)

C++ 将数组分成三部分(递归),c++,arrays,recursion,dynamic-programming,partition,C++,Arrays,Recursion,Dynamic Programming,Partition,问题链接: 我可以用动态规划来解决这个问题。 有人能给我解释一下编辑解决方案(递归)吗 编辑解决方案: #include<cstdio> #include<cstdio> #include<queue> #include<cstring> #include<vector> #include<iostream> #include<string> #include<algorithm> #includ

问题链接:

我可以用动态规划来解决这个问题。

有人能给我解释一下编辑解决方案(递归)吗

编辑解决方案:

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
typedef long long int int64;
int64 n,a[40],ans,vl;
无效fn(int64 i、int64 j、int64 k、int64 ptr){
如果(ptr==n){
vl=max(max(i,j),k);if(vl>n;for(i=0;i>a[i];
fn(0,0,0,0);
printf(“%lld\n”,ans);
返回0;
}

谢谢,

想法非常简单,你可以向三个集合中的任何一个集合(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;
    }
if(ptr==n){

vl=max(max(i,j),k);if(vl)非常感谢@amalsomI不明白为什么要用-2来回答这个问题。我曾努力用动态规划来解决这个问题。我无法理解递归解。我想理解它,因为它非常接近代码。@Marco Bonelli…编辑了这个问题