硬币找零问题的变化背后有什么想法?

时间:2019-01-19 08:46:12

标签: algorithm dynamic-programming coin-change

  

问题:给定一组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

1 个答案:

答案 0 :(得分:0)

dp[i][j]表示第[i, j]个子问题的解决方案;那是, dp[i][j]是使用硬币ij进行金额n更改的方式。

重复出现硬币找零问题

  • 第一种情况假设使用了第j个面额的单个硬币。由于对面额没有限制,j可能保持不变,因此可以再次用于较小的子问题:dp[i - xs[j - 1]][j]

没有重复的找零问题

与上述问题相同,但有一个额外的约束,即某些面额的硬币只能取一次。

  • 第一种情况假设使用了第j个面额的单个硬币。由于我们无法再使用面额j,因此j更改为j-1dp[i - xs[j - 1]][j - 1]

在忽略第j面额的两个问题中,第二种情况相同。