整数总和的算法
本文关键字:算法 和的 整数 | 更新日期: 2023-09-27 18:34:31
可能的重复项:
找到所有可能的数字组合以达到给定的总和
我必须创建从数字数组中选择数字的方法,其总和将根据需要精确,或者如果不存在,请选择最小的较大数字。这个函数的算法是什么?
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}。在这种情况下,返回您选择的一个 - 可能是您得到的第一个。
自定义数字和总和的算法是什么?
谢谢西蒙
这是称为子集和的问题的广义情况。这是一个NP完全问题,因此最著名的算法是伪多项式。如果你了解了上面的链接算法,你可以扣除解决你的问题所需的修改。
递归怎么样?
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。
我花了大约 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#,请告诉我。