设置指定数量的任何添加组合以达到特定目标值

时间:2018-03-29 08:20:51

标签: c# algorithm recursion numbers permutation

我正在寻找一种方法来获得所有可能的数字组合以达到指定的目标值。 设置的数字值可以重复

例如:
数字集是4,5,6,7,8 我想要达到的价值是16。

因此,我希望得到类似的内容:

4+4+4+4  
4+4+8  
5+5+6  
...  

我发现的任何解决方案都没有重复,如下所示:
Efficient algorithm to find a combination, which summation is equal to a known number, in a set of number

提前致谢!

1 个答案:

答案 0 :(得分:1)

您也可以使用相同的递归方法。但是,请勿从可能的项目集中删除已使用的项目。如果您想区分a+b+aa+a+b变体,请遍历所有设置(如果不是) - 仅显示当前位置的项目。

function Partitions(Sum, A[], CurIdx, Result)
  if Sum = 0
     output Result
  //all variants with permutations
  for i = 0 to A.Length - 1
     if A[i] <= Sum
        Partitions(Sum - A[i], A[], i, Result + A[i])

  //variants without permutations
  for i = CurIdx to A.Length - 1
     if A[i] <= Sum
        Partitions(Sum - A[i], A[], i, Result + A[i])

  // you don't need this, just for record:  
  //variant without repeats essentially does the next:
        Partitions(Sum - A[i], A[].Remove i-th item, i, Result + A[i])

   or (note  i+1 start point for the next recursion level)

  for i = CurIdx to A.Length - 1
     if A[i] <= Sum
        Partitions(Sum - A[i], A[], i + 1, Result + A[i])