2012-03-17 6 views
0

에서 항목의 목록에 따라 선택할 수있는 모든 조합 :목록 사용자가 다음 항목에 나는 C#에서 목록 상자가 C#을 목록 상자

Package1 
Package2 
Package3 
Package4 
Package5 
and so on... 

사용자는이 목록 상자에서 여러 항목을 선택할 수 있습니다. 나는 C#이나 Java (예 : Package # 1, Package2, Package3, Package1, Package2, Package4, Package 3 등)에서 사용자가 할 수있는 모든 가능한 선택을 알 수있는 알고리즘이 필요합니다.

+0

지금까지 가지고있는 것을 보여주세요. – RBarryYoung

답변

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 가능한 패키지를 chosing를위한 조합, 그래서 당신은 O(2^n) 시간이 필요합니다 [본 프로그램 포함]을 요청, 그래서 100 개 패키지와이 알고리즘을 호출하려고하지 않을 일을 어떤 알고리즘이 있습니다 ....

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입니다.

  • 나는 packages에 대한 LinkedList을 사용하고 난 그게 더 명확 찾아 때문에 새 개체를 만들었습니다. 성능을 향상 시키려면배열을 index [회귀 호출간에 변경] 순서로 사용하면 packages이 여러 번 반복되는 것을 피할 수 있습니다.
+0

여기에 내가 가지고있는 것입니다 : – TuSabesTuSabes

+0

Thx.Now 내가 가진 : public static void main (String [] args) { LinkedList packages = new LinkedList (); packages.addAll ((Arrays.asList (args))); printCombinations (패키지, 새 LinkedList ()); } 공공 정적 무효 printCombinations (LinkedList의 패키지 LinkedList의 졸) { 경우 (packages.size() == 0) { 에서 System.out.println (졸); 반환; } 문자열 팩 = packages.poll(); // 또한 머리를 제거합니다. sol.addLast (팩); printCombinations (새 LinkedList (패키지), sol); sol.removeLast(); printCombinations (새로운 LinkedList (패키지), sol); } // 어떻게 표시합니까? 출력은 어떻게 되나요? – TuSabesTuSabes

+0

@RalphZayas : 이것은 읽을 수 없으며 사용자가 묻는 것을 이해할 수 없습니다. – amit