当前位置: 首页 > 知识库问答 >
问题:

子集和重叠子问题(动态规划)

洪成济
2023-03-14

问题链接如下:
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;
}

共有1个答案

单于钊
2023-03-14

这样想:

如果集合[]元素中有一个和等于和,则有两种不同的可能性:

> < li>

最后一个元素(其索引为n-1)包含在sum -中

最后一个元素(其索引为n-1)不包括在总和中-

语句中的OR:< code > return isSubsetSum(set,n-1,sum-set[n-1]) || isSubsetSum(set,n-1,sum);检查两种可能性1。第二。递归地。

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

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

 类似资料:
  • 我无法弄清楚重叠子问题的DP第一属性在哪里适合子集和问题。然而,我理解最优子结构部分。在执行包含和排除元素的递归解决方案时,问题在哪里重叠 是不是因为这是一个NP问题,所以没有DP的两个性质 问题的链接是http://www.geeksforgeeks.org/dynamic-programming-subset-sum-problem/ 有人能帮助我理解这一点吗。

  • 为了使动态规划适用,一个问题必须具有两个关键属性:最优子结构和重叠子问题[1]。对于这个问题,我们将只关注后一个属性。 重叠子问题有多种定义,其中两个是: 如果一个问题可以分解为多次重用的子问题,或者问题的递归算法一遍又一遍地解决同一个子问题,而不是总是产生新的子问题,那么问题就被称为具有重叠的子问题[2]。 要应用动态规划,优化问题必须具备的第二个要素是子问题的空间必须“小”,因为问题的递归算法

  • 我有一个子集问题的工作代码,如果它发现一个子集等于所需的目标,它可以打印数字。 > 我想打印给定目标的所有可能的子集,我不知道要为此更改什么。 我如何让它对负数起作用?

  • 给定一组非负整数和一个值和,确定给定集合中是否有和等于给定和的子集。 例如: 我实际上用这段代码解决了问题: 然而,现在我想重建所有可能的组合,形成给定的总和。 是可以从我的回忆录矩阵中做到这一点,还是我必须以不同的方式做到这一点?

  • 我有点卡住了,我决定试试这个问题https://icpcarchive.ecs.baylor.edu/external/71/7113.pdf 为了防止它404'ing这里是基本的任务 编辑:我这么做纯粹是出于好奇。除了挑战自己,我不需要出于任何特殊原因去做这项任务 基本上,它是从一个数组中构建一个稀疏图,该图是无向的,并且由于-d的对称性。。。d跳跃,它也可以是一个完整的图(包括所有边)或相互不

  • 我正在练习动态编程,我正在努力调试我的代码。这个想法是在给定一组数字的情况下找出求和是否可能。这是我的代码: 以下是输出: 据我所知,在我的fe语句中,算法应该向上1行,然后查看x和y的差异并检查该槽是否可能。例如,在最明显的情况下,最后一行的最后一个元素。那将是10(y)-11(x),它应该一直回到它上面一行的索引1,我们知道这是True。不完全确定我做错了什么,如果能帮助理解这一点,将不胜感激