假设n = 3 使用数字1和2,得到和n的组合将是[1,2],[2,1],[1,1,1]。 3种组合。
如果n = 2 那么得到和n的组合将是[1,1]和[2]。 2种组合。
如何编写算法来计算1和2的组合数以得到n的总和?
答案 0 :(得分:1)
您所描述的内容似乎是Coin-Change Problem
类别中的dynamic-programming
。您可以查看以下链接,以便更好地了解它们 -
Coin Change Problem - GeeksForGeeks
Coin Change Problem - Algorithmist
由于只提供链接是不可接受的,我在这里发布一些链接的内容给你一个想法 -
给定值N,如果我们想要改变N美分,我们每个都有无限供应
S = {S1,S2,..,Sm}值硬币,
我们可以通过多少方式进行变革?
硬币的顺序无关紧要。
例如,对于N = 4且S = {1,2,3},
有四种解决方案:{1,1,1,1},{1,1,2},{2,2},{1,3}。
所以输出应该是4.
对于N = 10且S = {2,5,3,6}, 有五种解决方案:{2,2,2,2,2},{2,2,3,3},{2,2,6},{2,3,5}和{5,5}。<登记/> 所以输出应该是5.
最佳子结构
要计算总数解,我们可以将所有集合解分为两组
1)不含第m个硬币(或Sm)的溶液。
2)含有至少一种Sm的溶液
设count(S [],m,n)是计算解数的函数,
然后它可以写成 count(S [],m-1,n)和 count(S [],m,n-Sm)之和。
因此,问题具有最优的子结构属性,因为问题可以通过子问题的解决方案来解决。
重叠子问题
以下是Coin Change问题的简单递归实现。实现只是遵循上面提到的递归结构。
// Returns the count of ways we can sum S[0...m-1] coins to get sum n
int count( int S[], int m, int n )
{
// If n is 0 then there is 1 solution (do not include any coin)
if (n == 0)
return 1;
// If n is less than 0 then no solution exists
if (n < 0)
return 0;
// If there are no coins and n is greater than 0, then no solution exist
if (m <=0 && n >= 1)
return 0;
// count is sum of solutions (i) including S[m-1] (ii) excluding S[m-1]
return count( S, m - 1, n ) + count( S, m, n-S[m-1] );
}
如果您认为并且干了上面的代码,您应该能够掌握基本思想。我希望这能解决你的问题。
以上解释:
礼貌 - GeeksforGeeks
答案 1 :(得分:0)
这个问题可以通过数学方式解决。该等式是(n-r)Cr的总和,其中对于所有n> 0
,r = 0,1,2,...,n / 2注意,该等式可以进一步概括为n> 0并且仅设置{1,x}。除此之外,你应该看看@RahulNori提供的想法
N = 4
[1,1,1,1] - 1 combination (4C0)
[2,1,1], [1,2,1], [1,1,2] - 3 combination (3C1)
[2,2] - 1 combination (2C2)
N = 5
[1,1,1,1,1] - 1 combination (5C0)
[2,1,1,1], [1,2,1,1], [1,1,2,1], [1,1,1,2] - 4 combination (4C1)
[2,2,1], [2,1,2], [1,2,2] - 3 combination (3C2)
N = 6
[1,1,1,1,1,1] - 1 combination (6C0)
[2,1,1,1,1], [1,2,1,1,1], [1,1,2,1,1], [1,1,1,2,1], [1,1,1,1,2] - 5 combination (5C1)
[2,2,1,1], [2,1,2,1], [1,2,2,1], [2,1,1,2], [1,2,1,2], [1,1,2,2] - 6 combination (4C2)
[2,2,2] - 1 combination (3C3)