我有以下整数{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;
}
}
我知道这种方法甚至不能解决问题
答案 0 :(得分:0)
我需要将此集合划分为两个子集,以便集合的总和分别为14和10。
如果子集必须与某些值相加,那么最好将整个集合的总和作为这些值的总和,即在您的示例中为14 + 10 = 24。如果你只需要找到两个子集,那么问题就不那么困难了 - 找到任何与这些值之一相加的子集,并且该集合的其余元素必须与另一个值相加。
对于您提供的示例集{2,9,4,1,8}
,您说 答案为{9,1}, {2,4,8}
,但请注意,这不是唯一的答案;还有{2,8}, {9,4,1}
。