我正在编写自己的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 等
答案 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”作为不同的数字。我会留下这个让你解决。