C++ 使用递归从子集和中查找最大和

C++ 使用递归从子集和中查找最大和,c++,c,recursion,subset,C++,C,Recursion,Subset,我只想打印子集和中的最大和。实际上,我想要比较函数中的所有子集和值,然后只返回主函数中的最大和 我试图做的是将子集和值保存在一个新数组中。然后比较其中的值。但我无法做到这一点,因为它一无所获。 我想假设输入array大小为n=5,要求和的元素数为r=3,数组为: {1,2,3,4,5} 那么最大和应该是3+4+5=12。但是我的代码返回所有的总和 我想将总和值保存在新数组中 newArray[] = sum; 然后从新数组中找到最大值 这是我的代码: #include <stdio.h

我只想打印子集和中的最大和。实际上,我想要比较函数中的所有子集和值,然后只返回主函数中的最大和

我试图做的是将子集和值保存在一个新数组中。然后比较其中的值。但我无法做到这一点,因为它一无所获。 我想假设输入
array
大小为
n=5
,要求和的元素数为
r=3
,数组为:

{1,2,3,4,5}
那么最大和应该是
3+4+5=12
。但是我的代码返回所有的总和

我想将总和值保存在新数组中

newArray[] = sum;
然后从新数组中找到最大值

这是我的
代码

#include <stdio.h>
#include <iostream>
using namespace std;

void combinationRecursion(int start, int end, int index, int r, int *arr, int *data, int sum){

if(r == index){
    for(int i=0; i<r; i++){
        int val = data[i];
        cout<<val<<' ';
        sum = sum + data[i];

    }
    printf("sum %d\n",sum);
    printf("\n");

}
for(int i=start; i<end; i++){
    data[index] = arr[i];
    combinationRecursion(i+1, end, index+1, r, arr, data, sum);
   }
 }

 int main() {
     int arr[100], n, data[100], r;
     scanf("%d%d",&n,&r);

for(int i=0; i<n; i++) {
    scanf("%d",&arr[i]);
}
combinationRecursion(0, n, 0, r, arr, data, 0);
}
#包括
#包括
使用名称空间std;
无效组合递归(int开始、int结束、int索引、int r、int*arr、int*data、int和){
if(r==索引){

对于(int i=0;i如果您对大小
k
的子集(带基数
n
的集合外)感兴趣,则无需执行任何组合生成操作。您只需按降序对数组进行排序,然后选择顶部
k
元素,因为它们按降序排序,它们将给出m大小
k

的子集的最大和,让我们看看是否可以使用std::algorithms(未测试的代码)来实现

std::partial_sum(data.begin()、data.end()、std::plus);
std::向量子序列;
subSetSum.reserve(data.size());//-3,但meh。
std::transform(data.begin(),data.begin()+subSetLength-1,std::back_inserter(subSetSum),std::minus);//将为负
auto maxSum=-std::min_元素(subSetSum.begin(),subSetSum.end());

但是这里没有递归…

最后,我可以通过全局设置max来解决这个问题。 这是修改过的版本

int max1 = 0;
int combinationRecursion(int start, int end, int index, int r, int *arr, int *data){

if(r == index){
        int sum = 0;
    for(int i=0; i<r; i++){
        int val = data[i];
        sum = sum + data[i];
    }
     if(max1<sum){
        max1 = sum;
   }

}
for(int i=start; i<end; i++){
    data[index] = arr[i];
    combinationRecursion(i+1, end, index+1, r, arr, data);
}
 return max1;
}
intmax1=0;
int组合递归(int开始、int结束、int索引、int r、int*arr、int*data){
if(r==索引){
整数和=0;

对于(int i=0;iyah我可以这样做。但我实际想要的是比较递归函数中的所有子集和值,然后在主函数中返回最大值,以便我可以将该值用于其他目的。嗯,为什么不能这样使用该值?对我来说似乎是一样的。@MavishA如何计算该值并不重要;)NiVeRs方法是有效的,因此,即使您还需要其他子集和,您也可以使用此方法来计算最大值…@MavishA…但如果您已经拥有所有子集和,那么在它们之间找到最大值实际上是非常困难的easier@user463035818是的,但是我没有找到任何好的方法来存储子集和。如果你看我的代码,你可以看到我想要比较“和”值,然后从中找到最大值,并且子集在原始集中必须是连续的?@Surt是的,子集必须是连续的
int max1 = 0;
int combinationRecursion(int start, int end, int index, int r, int *arr, int *data){

if(r == index){
        int sum = 0;
    for(int i=0; i<r; i++){
        int val = data[i];
        sum = sum + data[i];
    }
     if(max1<sum){
        max1 = sum;
   }

}
for(int i=start; i<end; i++){
    data[index] = arr[i];
    combinationRecursion(i+1, end, index+1, r, arr, data);
}
 return max1;
}