【问题标题】:Subset Sum Overlapping subproblems (Dynamic programming)子集和重叠子问题(动态规划)
【发布时间】:2018-06-11 00:55:21
【问题描述】:

问题链接如下:
https://www.geeksforgeeks.org/dynamic-programming-subset-sum-problem/
我没有看到至少在输入案例中的问题中实现了重叠子问题属性。 例如在下面的链接中,递归树没有任何重叠的子问题
http://www.zrzahid.com/subset-sum-problem-dynamic-programming/

此外,例如在以下程序中,没有重叠的子问题。当没有重叠的子问题时,我不明白动态编程在这里有什么帮助。请解释一下。

bool isSubsetSum(int set[],int n, int sum)
{
    if(sum==0)
return true;
if(n==0 || sum<0)
    return false;
return isSubsetSum(set,n-1,sum-set[n-1]) || isSubsetSum(set,n-1,sum);
}
int main()
{
  int set[] = {3, 34, 4, 12, 5, 2};
  int sum = 9;
  int n = sizeof(set)/sizeof(set[0]);
  if (isSubsetSum(set, n, sum) == true)
     printf("Found a subset with given sum");
  else
     printf("No subset with given sum");
  return 0;
}

【问题讨论】:

    标签: c++ dynamic-programming subset-sum


    【解决方案1】:

    这样想:

    如果 set[] 元素中的总和等于 sum,则有两种不同的可能性:

    1. 最后一个元素(其索引为 n-1)包含在总和中 -> 在这种情况下,其他 n-1 个元素的总和为 sum - set[n-1]

    2. 最后一个元素(其索引为 n-1)不包含在总和中 -> 在这种情况下,其他 n-1 个元素的总和为 sum

    语句中的 OR:return isSubsetSum(set,n-1,sum-set[n-1]) || isSubsetSum(set,n-1,sum); 递归地检查可能性 1. 和 2.。

    如果set[]中有一些元素等于sum,则递归在某个点会达到sum = 0的情况;并且它将在最低递归级别返回 true,这会将 TRUE 传播到原始调用(请记住:如果 A 或 B 中的至少一个为 TRUE,则 A OR B 返回 TRUE)。

    否则,您将达到不等于 0 且 n 等于 0 的情况总和,这将传播 FALSE。

    【讨论】:

    • 谢谢,但我已经看懂了代码。我不理解这个问题的重叠子问题属性
    猜你喜欢
    • 2015-03-24
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2019-09-04
    • 2015-05-06
    • 2012-06-28
    相关资源
    最近更新 更多