Java:从列表中选择一个选择

时间:2014-06-09 15:44:25

标签: java list selection

我正在编写自己的Java棋盘游戏,我不知道如何解决以下问题:

我们有一个数字列表(a),让我们说: a = 1,1,1,2,2,2,3,3,4,4

现在我需要从这个列表中选择一些x数字。 加起来时,所选数字必须超过预定义数字。数字的顺序无关紧要。

问题:如何以有效的方式获得所有可能的选择而不重复?

所以例如: 从列表中我们需要选择3个数字,加起来超过4。 选项是: 1,1,2 (1,2,1被认为是重复的,就像2,1,1) 1,1,3 1,1,4- 1,2,2 1,2,3 1,2,4 1,3,3 1,3,4 1,4,4 2,2,2 等

1 个答案:

答案 0 :(得分:1)

您只需要枚举3个数字的所有可能组合:

public static void main(String[] args) {
  int[] numbers = {1, 1, 1, 2, 2, 2, 3, 3, 4, 4};
  int size      = 3;
  int minSum    = 4;

  search(numbers, size, minSum, 0, new LinkedList<Integer>());
}

private static void search(int[] numbers, int size, int minSum, int pos, Stack<Integer> stack) {
  if (stack.size() == size) {
    int sum = 0;
    for (int number : stack) {
      sum += number;
    }

    if (sum >= minSum) {
      System.out.println("Selection: " + stack);
    }

    return;
  }

  if (pos < numbers.length) {
    // Search by not adding the current number
    search(numbers, size, minSum, pos + 1, stack);
    // Search by adding the current number
    stack.push(numbers[pos]);
    search(numbers, size, minSum, pos + 1, stack);
    stack.pop();
  }
}

基于它当前明确地处理数组中的数字这一事实,可以使算法更快。也就是说,它将第一个“1”视为第二个“1”作为不同的数字。我会留下这个让你解决。