如何编写算法来查找两个数字之和的模式总数?

时间:2016-08-04 01:59:57

标签: algorithm combinations

假设n = 3 使用数字1和2,得到和n的组合将是[1,2],[2,1],[1,1,1]。 3种组合。

如果n = 2 那么得到和n的组合将是[1,1]和[2]。 2种组合。

如何编写算法来计算1和2的组合数以得到n的总和?

2 个答案:

答案 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)