我正在考虑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];
}
时,我怎么知道添加新硬币给我的解决方案有多少?
答案 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。