Algorithm 根据c列表框中的项目列表列出用户可以选择的所有组合
我有一个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
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>());