Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 卡、袋和硬币的重复关系理解_Algorithm_Dynamic Programming_Subset Sum_Recurrence - Fatal编程技术网

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?]