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

时间:2012-03-17 16:37:43

标签: algorithm permutation combinations

我在C#中有一个包含以下项目的列表框:

Package1
Package2
Package3
Package4
Package5
and so on...

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

1 个答案:

答案 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

备注:

  • 假设空解决方案[未选择包]也是此算法中的可行选项 - 如果不是,则可以在基本子句中轻松处理。
  • 假设订单并不重要。 Package1 AND Package2与Package2 AND Package1相同。
  • 选择包有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这么多次。