我正在尝试解决一个经典的硬币找零问题(动态规划)。
为了使用动态规划方法来找到从无限面额硬币中得到总和的所有唯一组合数,我使用了以下方法:
/*
n - number of coins
arr[] - coin denominations
x - total sum
dp[] - array to store number of combinations at index i.
*/
for (int j = 0; j < n; j++)
for (int i = 1; i <= x; i++)
if (arr[j] <= i)
dp[i] = (long) ((dp[i] + dp[i - arr[j]]) % (1e9 + 7));
这个代码可以帮我计算所有可能的独特组合数量:
例如:
Input:
n=3 x=9
Coins: 2 3 5
Output:
3
目前为止,一切顺利。但是我观察到,仅仅通过交换上述片段中的循环,就可以得到所有可能的排列
。
for (int i = 1; i <= x; i++)
for (int j = 0; j < n; j++)
if (arr[j] <= i)
dp[i] = (long) ((dp[i] + dp[i - arr[j]]) % (1e9 + 7));
这个代码给出了所有唯一可能的“排列”数量:
例如:
Input:
3 9
2 3 5
Output:
8
通过调试并逐次迭代,我绘制出了一种形成的模式,但不理解为什么会得到排列组合。
有人可以逐步解释一下吗?任何帮助将不胜感激。
谢谢。
这两个问题都可以在以下链接中找到: