【问题标题】:Getting wrong answer in Partition Equal Subset sum on GFG在 GFG 上的 Partition Equal Subset sum 中得到错误的答案
【发布时间】:2021-09-07 03:34:39
【问题描述】:

我正在尝试解决 GFG 上的partition equal subset problem。我知道通过将其减少到subset sum problem 来执行此操作的正确方法。但是,我想到了另一种方法,但我不知道它有什么问题。

我维护了两个总和变量:partition1 和 partition2,并且在每次递归调用时,所考虑的元素都可以转到其中任何一个。我正在检查两个总和是否在任何时候都相等,如果是,我返回 1。这是我的代码:

int traverse(int N,int arr[],int partition1,int partition2, int curr){
    
    if(partition1==partition2 and partition1!=0)
        return 1;
        
        
    if(curr>=N)
        return 0;
    
    //cout<<partition1<<" "<<partition2<<endl;    
    return traverse(N,arr,partition1+arr[curr],partition2,curr+1) or traverse(N,arr,partition1,partition2+arr[curr],curr+1);
}

目前我只关心重复而不是将其转换为 DP 解决方案的最佳方法,因为即使对于此输入,它也会给出错误的答案:

9(元素个数)

75 131 977 305 220 957 47 56 840(输入数组)

预期的输出是 NO,但我的代码给出的输出是 YES。谁能帮我弄清楚这个解决方案有什么问题?

【问题讨论】:

  • 您的第一个if 是否也需要检查所有号码是否已被使用,即curr == N
  • or 在递归调用中做了什么?
  • @AnkitMishra oralias||
  • 我知道。单独写,去掉or。
  • @AnkitMishra 我认为如果任一分支返回true,则返回true

标签: c++ arrays algorithm dynamic-programming


【解决方案1】:

你的 if 语句:

if(partition1==partition2 and partition1!=0)
    return 1;

可能会使函数过早返回 1,因为在遍历所有数字之前 partition1 仍然可以等于 partition2。对您的代码进行以下修改可解决此问题:

int traverse(int N, int arr[], int partition1, int partition2, int curr) {

    if (curr >= N)
        return partition1 == partition2 && partition1 != 0;
   
    return traverse(N, arr, partition1 + arr[curr], partition2, curr + 1) || traverse(N, arr, partition1, partition2 + arr[curr], curr + 1);
}

【讨论】:

  • 非常感谢!我弄错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
相关资源
最近更新 更多