在提供的总和的int列表中找到组合

时间:2016-02-04 14:09:42

标签: c#

我坚持这个我会试着用一个例子解释一下吗? 假设一只青蛙只向前移动,但它可以步长1英寸或跳跃2英寸长。青蛙可以使用不同的步骤和跳跃组合覆盖相同的距离。

编写一个函数,计算青蛙可以用来覆盖给定距离的不同组合的数量。

例如,可以通过三种方式覆盖3英寸的距离:步进步骤,步进跳跃和跳跃步骤。

我没有成功编写任何代码,这就是我要问的原因,但我会尝试用c#方式解释我的问题。我得到了int [1,2,3]的列表,我需要找到3的可能组合,可以是1 + 1 + 1,1 + 2,2 + 1。我如何在代码中实现这一目标?

1 个答案:

答案 0 :(得分:1)

为了给自己一些想法,让我们从插图开始。

假设距离为5英寸。 s是步骤,j是跳跃。然后解决方案包括:

5 steps solution:
s-s-s-s-s

4 steps solution:
s-s-s-j
s-s-j-s
s-j-s-s
j-s-s-s

3 steps solution:
s-j-j
j-s-j
j-j-s

然后是距离为4的另一种情况:

4 steps solution:
s-s-s-s

3 steps solution:
s-s-j
s-j-s
j-s-s

2 steps solution:
j-j

另一个是当距离为6时,我们将:

6 steps solution:
s-s-s-s-s-s

5:
s-s-s-s-j
s-s-s-j-s
s-s-j-s-s
s-j-s-s-s
j-s-s-s-s

4:
s-s-j-j
s-j-s-j
s-j-j-s
j-s-s-j
j-s-j-s
j-j-s-s

3:
j-j-j

假设距离为D,从上图可以看出,我们已经得出一些特征:

  1. 可能的动作次数(A)为[D = 6,A = 4; D = 5,A = 3; d = 4; A = 3]。我们也可以很容易地找到[D = 3,A = 2; D = 2,A = 2; D = 1,A = 1]

    因此,您可以看到A:1,2,2,3,3,4的模式。对于D:1,2,3,4,5,6。你得到了第一个关系:

    A = int(D/2) + 1
    
  2. 您还会注意到下一个模式。看一下D = 6的例子。您需要计算以下内容:

    6 steps: given 6 take 0    
    5 steps: given 5 take 1    
    4 steps: given 4 take 2    
    3 steps: given 3 take 3
    

    在这里您可以找到另一种模式:请注意,这是组合问题。 D = 6的结果由下式给出:

    6C0 + 5C1 + 4C2 + 3C3
    
  3. 另请注意,假设aCb注意到组合,a从D减少到D-A + 1,而b从0增加到A-1。

  4. 现在知道这些模式可以通过以下方式轻松解决问题:

    1. 从D到D-A + 1创建for循环。
    2. 在for循环中你有两个变量:a和b。 a不断增加,b不断减少
    3. 创建简单的功能,接收& b并具有aCb的操作。

      http://www.mathwords.com/c/combination_formula.htm

      aCb = a!/(b!(a-b)!)
      
    4. 在for循环的每个循环中求和结果。

    5. 你完成了!