可能重复:
Finding all possible combinations of numbers to reach a given sum
我必须创建一个方法,从数组中选择数字,其总和将是必需的,或者如果不存在则选择最小的更大的数字。 这个函数的算法是什么?
public int[] selectExactSum(int[] X, int SUM) {
}
例如: 数字为:{5,2,8,4,6},所需金额为12。
结果将是:{2,4,6}
如果要求总和为13,结果将是:{2,8,4} - 所以,总和将在这种情况下为14 - 第一个最小值更大。
如果要求总和为15,则可能的结果为:{5,2,8}或{5,4,6}。在这种情况下,请返回您选择的一个 - 可能是您获得的第一个。
自定义数字和求和的算法是什么?
谢谢, 西蒙
答案 0 :(得分:6)
这是一个名为subset sum的问题的概括案例。这是一个NP完全问题,因此最着名的算法是pseudo-polynomial。 如果您了解上述链接算法,则可以扣除解决问题所需的修改。
答案 1 :(得分:1)
递归怎么样?
public static int[] SelectExactSum(int[] x, int sum) {
int[]
rest = x.Skip(1).ToArray(),
with = x.Length == 1 ? x : x.Take(1).Concat(SelectExactSum(rest, sum - x[0])).ToArray(),
without = x.Length == 1 ? new int[0] : SelectExactSum(rest, sum);
int withSum = with.Sum(), withoutSum = without.Sum();
return
withSum >= sum ? (withoutSum >= sum ? (withSum < withoutSum ? with : without) : with) :
withoutSum >= sum ? without : new int[0];
}
注意:如问题所述,致电SelectExactSum(new int[] {5,2,8,4,6}, 13)
不会返回{2,8,4},但{5,8}实际上总计为13。
答案 2 :(得分:0)
我花了大约15分钟才完成它,你可以看到它在这里运行:
http://jesuso.net/projects/selectExactSum/index.php?numbers=5%2C2%2C8%2C4%2C6&reqSum=15
这是代码:
http://jesuso.net/projects/selectExactSum/selectExactSum.txt
我尽可能简单,但它是用PHP制作的,如果你需要一些帮助将它翻译成c#,请告诉我。