适合数字的最佳方法

时间:2016-12-25 05:20:28

标签: algorithm set knapsack-problem bin-packing

我有以下整数{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;
    }
}

我知道这种方法甚至不能解决问题

1 个答案:

答案 0 :(得分:0)

  

我需要将此集合划分为两个子集,以便集合的总和分别为14和10。

如果子集必须与某些值相加,那么最好将整个集合的总和作为这些值的总和,即在您的示例中为14 + 10 = 24。如果你只需要找到两个子集,那么问题就不那么困难了 - 找到任何与这些值之一相加的子集,并且该集合的其余元素必须与另一个值相加。

对于您提供的示例集{2,9,4,1,8},您说 答案为{9,1}, {2,4,8},但请注意,这不是唯一的答案;还有{2,8}, {9,4,1}