【问题标题】:find combination in list of int for provided sum [duplicate]在提供的总和的 int 列表中查找组合 [重复]
【发布时间】:2016-02-04 14:09:42
【问题描述】:

我被困在这个问题上,我会尝试通过一个例子来解释它吗? 假设一只青蛙只向前移动,但它可以移动 1 英寸长的步长或 2 英寸长的跳跃。青蛙可以使用不同的步法和跳跃组合来跑相同的距离。

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

例如,3英寸的距离可以通过三种方式覆盖:step-step-step、step-jump和jump-step。

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

【问题讨论】:

  • 请尝试用代码说明您的问题。
  • @James Thorpe 如果您查看我的问题,它与您标记的重复问题回复不同。我问的是给定总和的组合,而不仅仅是组合。我只是不知道为什么人们甚至不阅读就对问题投反对票:(
  • 一旦你有了枚举所有可能组合的方法,你就可以对每个组合求和,看看它是否与你的目标匹配。
  • 我刚刚使用递归解决了这个问题——如果你知道这个概念是什么,那么我认为这将是最简单的方法。在每个递归步骤中,考虑到已经采取的步骤,递归下一个可能的步骤。建立一个列表/字典/等。展开递归堆栈时的有效组合。这是一个巧妙的问题,因为一旦你解决了它,你就可以轻松地扩展它来处理任何步长间隔和最大距离。

标签: c#


【解决方案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。

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

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

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

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

你就完成了!

【讨论】:

  • 我会试试你的登录,昨晚我发布这个问题时已经很晚了,今天早上刚醒来,会尝试一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多