Algorithm 卡、袋和硬币的重复关系理解
基本上可以归结为以下几点:Algorithm 卡、袋和硬币的重复关系理解,algorithm,dynamic-programming,subset-sum,recurrence,Algorithm,Dynamic Programming,Subset Sum,Recurrence,基本上可以归结为以下几点: 给定一个由n个整数和一个正整数m(1)组成的数组,要首先理解该解决方案,您需要了解以下内容- 具有i项的集合的子集(假设这组子集为i)是- 1) 具有i-1项的集合的子集。让这组子集用J表示 2) 所有这些子集(步骤1)都有第i个元素的并集。让这组子集用K表示 示例-将项目设为[1,2,3] 现在,有2个项目的集合的子集是-{},{1},{2},{1,2},这是J 所以,K={3},{1,3},{2,3},{1,2,3} I=J+K 现在让我们转到您的问题。 类似或您
给定一个由n个整数和一个正整数m(1)组成的数组,要首先理解该解决方案,您需要了解以下内容- 具有i项的集合的子集(假设这组子集为i)是- 1) 具有i-1项的集合的子集。让这组子集用J表示 2) 所有这些子集(步骤1)都有第i个元素的并集。让这组子集用K表示 示例-将项目设为[1,2,3] 现在,有2个项目的集合的子集是-{},{1},{2},{1,2},这是J 所以,K={3},{1,3},{2,3},{1,2,3} I=J+K 现在让我们转到您的问题。 类似或您可以调用类似移动方法
dp[i][j]
(或i)是dp[i-1][j]
(或j)加K的总和
K可以在J中找到第i个元素,即dp[i-1][(J-a[i])%m]
。现在,因为我们已经包括了第i项,所以我们需要添加一个数字,该数字的总和将是第i项所需的总和,因为它已经包括在内。这就是使用(j-a[i])
的原因
如何获得绝对值?只需制作一个函数,返回给定数字的绝对值,并在您认为需要的任何地方使用它
下面是函数的代码-
int abs(int x){
return x>0?x:-x;
}
您没有回答我关于如何记住示例6、7、7的先前状态的问题。
dp[2][0]
如果包含最后一个元素,我们需要检查是否得到余数为零。现在,如果这个元素被包括进来得到零余数,那么其他元素的和(比如s)应该是(s+7)%5=0
或s+7=5k
(即它是5的倍数),这就给出了s=5k-10+3
或s=5q+3
,即我们得到3作为其他元素和的余数。因此,dp[1][3]
(当其他元素的总和为余数3时)需要准确地计算我的观点。dp[1][3]未使用[6,7,7]之前的指数进行计算。如果你能给我解释一下,那就太好了。dp[1][3]会被计算出来,虽然它可能是不同的东西,它的计算结果可能是零,但这是怎么回事?dp[2][0的结果将如何为1?]