我坚持这个我会试着用一个例子解释一下吗? 假设一只青蛙只向前移动,但它可以步长1英寸或跳跃2英寸长。青蛙可以使用不同的步骤和跳跃组合覆盖相同的距离。
编写一个函数,计算青蛙可以用来覆盖给定距离的不同组合的数量。
例如,可以通过三种方式覆盖3英寸的距离:步进步骤,步进跳跃和跳跃步骤。
我没有成功编写任何代码,这就是我要问的原因,但我会尝试用c#方式解释我的问题。我得到了int [1,2,3]的列表,我需要找到3的可能组合,可以是1 + 1 + 1,1 + 2,2 + 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,从上图可以看出,我们已经得出一些特征:
可能的动作次数(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
您还会注意到下一个模式。看一下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
另请注意,假设aCb注意到组合,a从D减少到D-A + 1,而b从0增加到A-1。
现在知道这些模式可以通过以下方式轻松解决问题:
创建简单的功能,接收& b并具有aCb的操作。
http://www.mathwords.com/c/combination_formula.htm
aCb = a!/(b!(a-b)!)
在for循环的每个循环中求和结果。
你完成了!