Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从列表中选择一个选项_Java_List_Selection - Fatal编程技术网

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

Java:从列表中选择一个选项,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

我正在编写自己的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,2
等等。

您只需列举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。非常感谢!似乎工作良好,我会检查这个代码后,在我自己的电脑上。