Java:从列表中选择一个选项
我正在编写自己的Java棋盘游戏,我不确定如何处理以下问题: 我们有一个数字列表(a),比如: a=1,1,1,2,2,3,3,4,4 现在我需要从这个列表中选择x个数字。 所选数字相加时必须超过预定义的数字。数字的顺序并不重要 问题:如何以有效的方式获得所有可能的选择而不重复 例如: 从列表a中,我们需要选择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,2Java:从列表中选择一个选项,java,list,selection,Java,List,Selection,我正在编写自己的Java棋盘游戏,我不确定如何处理以下问题: 我们有一个数字列表(a),比如: a=1,1,1,2,2,3,3,4,4 现在我需要从这个列表中选择x个数字。 所选数字相加时必须超过预定义的数字。数字的顺序并不重要 问题:如何以有效的方式获得所有可能的选择而不重复 例如: 从列表a中,我们需要选择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
等等。您只需列举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();
}
}
publicstaticvoidmain(字符串[]args){
int[]数字={1,1,1,2,2,3,3,4,4};
int size=3;
int minSum=4;
搜索(数字、大小、最小值、0、新LinkedList());
}
私有静态无效搜索(int[]数字、int大小、int最小值、int位置、堆栈){
if(stack.size()==size){
整数和=0;
用于(整数编号:堆栈){
总和+=数字;
}
如果(总和>=分钟){
System.out.println(“选择:+堆栈);
}
返回;
}
如果(位置<数字长度){
//通过不添加当前号码进行搜索
搜索(数字、大小、分钟数、pos+1、堆栈);
//通过添加当前号码进行搜索
堆栈推送(数字[pos]);
搜索(数字、大小、分钟数、pos+1、堆栈);
stack.pop();
}
}
该算法可以更快,因为它当前可以清楚地处理数组中的数字。也就是说,它将第一个“1”与第二个“1”视为不同的数字。我将把这个留给你去解决。还有更多的可能性。4+其他任何两个数字超过4;很明显,对不起,我把“超越”和“平等”混淆了。编辑。所以这实际上是一个很难解决的问题。看看这个。抓取所有可能的组合,然后将每个数字组合相加,并检查其是否大于您的数字。当我编译并运行此程序时,我得到一个错误。无法将LinkedList转换为堆栈!当我在第9行将堆栈更改为LinkedList时,我没有得到任何输出,而在第6行将LinkedList更改为堆栈时,我得到了重复的输出(一个循环)!哦,用Stack替换LinkedList。非常感谢!似乎工作良好,我会检查这个代码后,在我自己的电脑上。