为什么这段代码总是返回1?我发现了子集的总和。此代码始终返回true。
#include<iostream>
using namespace std;
bool sum1(int arr[],int sum,int k,int tsum,int m,int n)
{
if(sum+arr[k]==m)
{
return true;
}
else if(sum+arr[k]+arr[k+1]<=m)
{
sum1(arr,sum+arr[k],k+1,tsum-arr[k],m,n);
}
if((sum+tsum-arr[k]>=m) && (sum+arr[k+1]<=m))
{
sum1(arr,sum,k+1,tsum-arr[k],m,n);
}
else if(k>n)
{
return false;
}
//return false;
}
int main()
{
int arr[]={7,11,13,24};
if(sum1(arr,0,1,55,1,4))
{
cout<<1;
}
else{
cout<<0;
}
}
答案 0 :(得分:0)
在传递函数内部的值时发生轻微错误。
您必须以元素k = 0开头,因为您必须先搜索第0个索引,而不是1。
谨防这将允许您搜索从第0个索引到结尾的总和。也就是说,在这种特殊情况下,7
或7+11
或7+11+13
或7+11+13+24
。使用OP提供的代码,您无法检查之类的内容 11+24
。
这里:
OP也忘了在递归调用之前添加return语句。还应该尽早检查k> n。
#include<iostream>
using namespace std;
bool sum1(int arr[],int sum,int k,int tsum,int m,int n)
{
if(sum+arr[k]==m)
{
return true;
}
else if(k>n)
{
return false;
}
else if(sum+arr[k]+arr[k+1]<=m)
{
return sum1(arr,sum+arr[k],k+1,tsum-arr[k],m,n-1);
}
else if((sum+tsum-arr[k]>=tsum) && (sum+arr[k+1]<=tsum))
{
return sum1(arr,sum,k+1,tsum-arr[k],m,n);
}
return false;
}
int main()
{
int arr[]={7,11,13,24};
if(sum1(arr,0,0,55,31,4))
{
cout<<1;
}
else{
cout<<0;
}
}
您也可以手动指定要检查的范围。示例k = 1且n = 4将添加以下可能性:11+13
或11+13+24
。但要注意,如果你改变n,也相应地改变tsum的范围。 k = 0和n = 3 tsum的例子应为31。