我在C#中有一个包含以下项目的列表框:
Package1
Package2
Package3
Package4
Package5
and so on...
用户可以从此列表框中选择多个项目。我需要一个c#或Java(最好是c#)的算法,可以告诉我用户可以做的所有选择,例如Package1和Package2,Package3和Package1,Package2,Package4和Package3等。
答案 0 :(得分:0)
你可以使用递归,"猜测"如果第一个包是否在组合中 - 并且在没有第一个包的情况下递归调用。
的伪代码:
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
备注:强>
2^n
个可能的组合,所以任何执行你要求的算法[包括这个]都需要O(2^n)
时间,所以我不会尝试用100调用这个算法包.... 在java中,它看起来像这样:
public static void printCombinations(LinkedList<String> packages, LinkedList<String> sol) {
if (packages.size() == 0) {
System.out.println(sol);
return;
}
String pack = packages.poll(); //also removes the head
sol.addLast(pack);
printCombinations(new LinkedList(packages),sol);
sol.removeLast();
printCombinations(new LinkedList(packages),sol);
}
和invokation是:
printCombinations(packages, new LinkedList<String>());
其中packages
是包含所有套餐的LinkedList
。
LinkedList
用于packages
并创建了新对象,因为我
发现它更清楚。为了提高性能 - 您可以使用单个
数组index
[将在递归调用之间更改]
为避免重复packages
这么多次。