子集总和总是返回1

时间:2017-06-25 13:52:23

标签: c++

为什么这段代码总是返回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;
    }
}

1 个答案:

答案 0 :(得分:0)

在传递函数内部的值时发生轻微错误。

您必须以元素k = 0开头,因为您必须先搜索第0个索引,而不是1。

谨防这将允许您搜索从第0个索引到结尾的总和。也就是说,在这种特殊情况下,77+117+11+137+11+13+24。使用OP提供的代码,您无法检查之类的内容 11+24

这里:

  • sum是当前遍历的元素的当前总和。
  • k是以
  • 开头的索引
  • tsum是数组元素的总和
  • m是要找到的子数组元素的总和
  • n是数组的大小(或您想要从第k个索引检查的范围)。

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+1311+13+24。但要注意,如果你改变n,也相应地改变tsum的范围。 k = 0和n = 3 tsum的例子应为31。