【问题标题】:Best approach to fit numbers拟合数字的最佳方法
【发布时间】: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


【解决方案1】:

我需要将这个集合分成两个子集,这样集合的总和分别为 14 和 10。

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

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

【讨论】:

  • “不是很难”从哪个角度?如何以幼稚的方式实现,或者时间复杂度的问题? :-)
  • @Caleb 确实如此。最好的解决方案是列出所有可能的集合。谢谢指出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
相关资源
最近更新 更多