Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 根据c列表框中的项目列表列出用户可以选择的所有组合_Algorithm_Permutation_Combinations - Fatal编程技术网

Algorithm 根据c列表框中的项目列表列出用户可以选择的所有组合

Algorithm 根据c列表框中的项目列表列出用户可以选择的所有组合,algorithm,permutation,combinations,Algorithm,Permutation,Combinations,我有一个C语言的列表框,其中包含以下项目: Package1 Package2 Package3 Package4 Package5 and so on... 用户可以从此列表框中选择多个项目。我需要一个c或Java的算法,最好是c,它可以告诉我用户可以做的所有可能的选择,例如Package1和Package2,Package3和Package1,Package2,Package4和Package3,等等。你可以使用递归,猜测第一个包是否在组合中,并在没有第一个包的情况下递归调用 伪代码: c

我有一个C语言的列表框,其中包含以下项目:

Package1
Package2
Package3
Package4
Package5
and so on...

用户可以从此列表框中选择多个项目。我需要一个c或Java的算法,最好是c,它可以告诉我用户可以做的所有可能的选择,例如Package1和Package2,Package3和Package1,Package2,Package4和Package3,等等。

你可以使用递归,猜测第一个包是否在组合中,并在没有第一个包的情况下递归调用

伪代码:

combinations(packages, sol):
   if (packages.length == 0): //base clause
      print sol
      return
   package <- packages.first //1 possibility: the first package is in the combination
   packages.removeFirst()
   sol.append(package) 
   combinations(packages,sol) //recursively invoke without the first package
   sol.removeLast() //clean up environment - remove the last added package
   combinations(packages,sol) //2nd possibility: the first package is not in the combination
通过以下方式调用:

printCombinations(packages, new LinkedList<String>());
其中packages是包含所有包的LinkedList

我将LinkedList用于包并创建了新对象,因为 我觉得更清楚。为了提高性能,您可以使用单个 在中具有索引[在递归调用之间将更改]的数组 为了避免多次重复包装。
现在我有:public static void mainString[]args{LinkedList packages=new LinkedList;packages.addAllArrays.asListargs;printCombinationspackages,new LinkedList;}public static void printCombinations LinkedList packages,LinkedList sol{if packages.size==0{System.out.printlnsol;return;}String pack=packages.poll;//还删除头sol.addLastpack;printCombinationsnew-linkedlistpackes,sol;sol.removeLast;printCombinationsnew-linkedlistpackes,sol;}//HowDoIDisplayTheOutputOfThisandTheReverse@RalphZayas:这是不可读的,我无法理解您的要求。您编写的函数非常有效,它显示以下内容:[Package1,Package2,Package3,Package4][Package1,Package2,Package3][Package1,Package2,Package4][Package1,Package2][Package2][Package1,Package3,Package4][Package1,Package3][Package1,Package4][Package1][Package2,Package3,Package4][Package2,Package4][Package2][Package3,Package4][Package4]现在我只需要显示上面的每个结果组合的对立面。例如[Package3,Package4]然后我会显示[Package4,Package3]一个很简单,如果我有3个项目在集合中呢?@RalphZayas:你可以使用
printCombinations(packages, new LinkedList<String>());