如果支付硬币的顺序很重要,可以通过多少种方式进行更改?

时间:2014-10-31 13:19:22

标签: algorithm dynamic-programming

我正在考虑this问题的变体:给出一个面额列表 S 和更改金额 n ,我们可以通过多少种方式来实现如果支付硬币的顺序很重要?

例如,如果S = {1,2}n = 4,则结果应为5(1,2,1)(1,1,2)(2,1,1),{ {1}}和(1,1,1,1)都是可能的解决方案。在订单无关紧要的情况下解决这个问题很容易,但我遇到了这种情况。

考虑给出here的代码:

(2,2)

当我们有这一行int count( int S[], int m, int n ) { int i, j, x, y; // We need n+1 rows as the table is consturcted in bottom up manner using // the base case 0 value case (n = 0) int table[n+1][m]; // Fill the enteries for 0 value case (n = 0) for (i=0; i<m; i++) table[0][i] = 1; // Fill rest of the table enteries in bottom up manner for (i = 1; i < n+1; i++) { for (j = 0; j < m; j++) { // Count of solutions including S[j] x = (i-S[j] >= 0)? table[i - S[j]][j]: 0; // Count of solutions excluding S[j] y = (j >= 1)? table[i][j-1]: 0; // total count table[i][j] = x + y; } } return table[n][m-1]; } 时,我怎么知道添加新硬币给我的解决方案有多少?

2 个答案:

答案 0 :(得分:2)

仅生成数字:我参考jpmath的评论。

仅供学习使用

最简单的适应是用一维扩展表格。

table[i][j][k]将是table[i][j]意味着(可能j =数字硬币和i =总和),最后一枚硬币为k

在每个步骤中迭代每个coin >= k并添加所有必要的内容。

由于动态编程总是包含合理的界限,因此可以轻松适应中等较慢的运行时间。但是,由于Set S应该很小,不应该是一个问题。

答案 1 :(得分:0)

这与Fibonacci数字密切相关。解决方案是对我原始帖子中给出的代码的一个非常简单的修改。

所有必须做的就是这一行:

// Count of solutions including S[j]
x = (i-S[j] >= 0)? table[i - S[j]][j]: 0;

更改为

// Count of solutions including S[j], but taking all "m" coins into account
x = (i-S[j] >= 0)? table[i - S[j]][m - 1]: 0;

这个问题在StackOverflow上显然是discussed previously