问题:给定一组
n
个硬币,它们的面值唯一,并且有一个值change
,找到对change
进行更改的多种方法。
假设我们可以多次使用一个面额,这是我想出的伪代码
1. NUM-WAYS(denom[], n, change)
2. dp = [change + 1][n + 1]
3. for i = 0 to n
4 dp[i][0] = 1
5. xs = denom.sorted
6. for i = 1 to change
7. for j = 1 to n
8. if xs[j - 1] > i
9. dp[i][j] = dp[i][j - 1]
10. else
11. dp[i][j] = dp[i - xs[j - 1]][j] + dp[i][j - 1]
12. return dp[change][n]
上面的算法对我来说很清楚。但是,如果只允许我们使用一次面额,那么第11行将更改为dp[i - xs[j - 1]][j - 1] + dp[i][j - 1]
,就好像根本不允许我们使用当前面额一样。我没办法解决这个问题。你能解释一下吗?
这是一些测试运行:
Change: 3, denominations: [8, 3, 1, 2]
11111
01111
01222
01233
// use once
Change: 3, denominations: [8, 3, 1, 2]
11111
01111
00111
00122
Change: 4, denominations: [3, 1, 2]
1111
0111
0122
0123
0134
// use once
Change: 4, denominations: [3, 1, 2]
1111
0111
0011
0012
0001
答案 0 :(得分:0)
让dp[i][j]
表示第[i, j]
个子问题的解决方案;那是,
dp[i][j]
是使用硬币i
至j
进行金额n
更改的方式。
j
个面额的单个硬币。由于对面额没有限制,j
可能保持不变,因此可以再次用于较小的子问题:dp[i - xs[j - 1]][j]
。与上述问题相同,但有一个额外的约束,即某些面额的硬币只能取一次。
j
个面额的单个硬币。由于我们无法再使用面额j
,因此j
更改为j-1
:dp[i - xs[j - 1]][j - 1]
在忽略第j
面额的两个问题中,第二种情况相同。