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

Finding the maximum sum from the subset sum using recursion

本文关键字:查找 子集 递归      更新时间:2023-10-16

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

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

{1,2,3,4,5}

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

我想将和值保存在newArray 中

newArray[] = sum;

然后从newArray中找到最大值。

这是我的code:

#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 %dn",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);
}

如果您对基数为n的集合外大小为k子集感兴趣,那么您不需要执行任何组合生成操作。您可以按递减顺序对数组进行排序,然后选择最前面的k元素,因为它们按递减顺序排序,所以它们将给出大小为k的子集的最大和。

我终于能够通过全局设置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;
}

让我们看看是否可以使用std::算法(未经测试的代码(来完成。

std::partial_sum(data.begin(), data.end(), std::plus<int>);
std::vector<int> subSetSum;
subSetSum.reserve(data.size()); // -3 but meh.
std::transform(data.begin(), data.begin()+subSetLength-1, std::back_inserter(subSetSum), std::minus<int>); // will be negative
auto maxSum = -std::min_element(subSetSum.begin(), subSetSum.end());

但这里没有递归。。。