把数字写成总和的方法

时间:2016-04-23 23:04:16

标签: sum combinations

我想以10号为单位写出所有可能的方式,作为单位3,4,...,n-1(不是2)的总和 例如,我可以写10作为

10=10(units)
10=7 + 1*3 or 
10=4 + 2*3 or
10=3 + 1*3 + 1*4 or
10=2 + 2*4 or ....

我不关心组合的数量! 我想要组合!!!我的意思是像这样输出的算法

un 3 4 5 6 7 8 9 10
-------------------
10 0 0 0 0 0 0 0 0
07 1 0 0 0 0 0 0 0 
04 2 0 0 0 0 0 0 0 
03 1 1 0 0 0 0 0 0 
02 0 2 0 0 0 0 0 0   etc

欢迎任何回复!!!

1 个答案:

答案 0 :(得分:0)

  1. 从零开始
  2. 尝试添加最大可能的数字
  3. 存储结果,如果您到达目标总和
  4. 如果您以小于目标金额结束,请转到(2)
  5. else(如果你的结束时超过了目标金额)
    1. 撤消上一个添加步骤,尝试添加少一个。如果您没有任何更小的号码可以尝试,请在过去撤消另外一个 如果你用尽所有可能的添加物,你已经找到所有组合并且可以退出。
  6. 示例:

    target = 10
    0
    0 + 9 -> not there yet
    0 + 9 + 9 -> too much, try something less
    0 + 9 + 8 -> too much, try less
    ...
    ...
    ...
    0 + 9 + 3 -> too much, cant try any less
    0 + 8 -> not there yet
    0 + 8 + 8 -> too much
    ...
    ...
    ...
    0 + 8 + 3 -> too much, cant try any less
    0 + 7 -> not there yet
    0 + 7 + 7 -> too much
    0 + 7 + 6 -> too much
    ...
    ...
    ...
    0 + 7 + 3 -> thats it! save!
    0 + 6 -> not yet
    0 + 6 + 6 -> too much...
    

    我希望你明白这个想法...... :) 它会比尝试所有可能的组合并仅选择总和为10的那些快得多。这种方法称为回溯(https://en.wikipedia.org/wiki/Backtracking),因为你试图向某个方向前进(添加最大数量) ,但是当你失败(总和太大)时,你会追踪你的进度,然后尝试不同的东西。

    然后你可以通过更聪明的方式尝试可能性来加快速度(0 + 7 + 7过多4,所以不要尝试0 + 7 + 6,但直接跳到0 + 7 + 3)。