【发布时间】:2016-12-25 05:20:28
【问题描述】:
我有以下整数集{2,9,4,1,8}。我需要将此集合分成两个子集,以便集合的总和分别为 14 和 10。在我的示例中,答案是{2,4,8} 和{9,1}。我不是在寻找任何代码。我很确定必须有一个标准算法来解决这个问题。由于我没有成功通过谷歌搜索并发现自己,我在这里发布了我的查询。那么解决这个问题的最佳方法是什么?
我的尝试是这样的......
public class Test {
public static void main(String[] args) {
int[] input = {2, 9, 4, 1, 8};
int target = 14;
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < input.length; i++) {
stack.add(input[i]);
for (int j = i+1;j<input.length;j++) {
int sum = sumInStack(stack);
if (sum < target) {
stack.add(input[j]);
continue;
}
if (target == sum) {
System.out.println("Eureka");
}
stack.remove(input[i]);
}
}
}
private static int sumInStack(Stack<Integer> stack) {
int sum = 0;
for (Integer integer : stack) {
sum+=integer;
}
return sum;
}
}
我知道这种方法甚至无法解决问题
【问题讨论】:
-
这就是多重背包问题。 en.wikipedia.org/wiki/Knapsack_problem 还是装箱问题。这在一定程度上取决于您未指定的其他约束,例如是否需要使用所有元素。
-
@ErwinBolwidt 最后应使用所有元素。我说我的问题有 2 个子集结果。我需要一个通用算法将父集划分为 n 个子集,其中每个子集的总和为某个指定的数字。
标签: algorithm set knapsack-problem bin-packing