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;
}