Gegeben sei eine Menge von n ganzen zahlen, die Liste aller möglichen Teilmengen mit Summe>=k

Gegeben eine unsortierte Menge der ganzen zahlen in form eines Arrays, finden Sie alle möglichen Teilmengen, deren Summe größer als oder gleich ein const integer k,
zB:- Unser set {1,2,3} und k=2

Möglichen Teilmengen:-

 {2},
 {3},
 {1,2},
 {1,3},
 {2,3}, 
 {1,2,3}

Ich denken kann, ein naiver Algorithmus, der eine Liste aller Teilmengen von set und überprüft, ob die Summe der Teilmenge ist >=k ist oder nicht, aber eine exponentielle Algorithmus und Auflistung aller Teilmengen erfordert O(2^N). Kann ich bei der dynamischen Programmierung lösen, die es in polynomieller Zeit?

  • Wenn Sie daran interessiert sind, drucken oder mit der Auflistung aller dieser Teilmengen, die dann im schlimmsten Fall können Sie immer noch 2^N-1 (alle außer leere) Teilmengen, die Sie brauchen, um Liste. Sie konnte jedoch zählen wie viele es sind, die mit dynamischer Programmierung in polynomieller.
  • Wie können wir die Anzahl solcher Teilmengen, die mit der dynamischen Programmierung?
  • Zu finden, wenn es eine Teilmenge, die Summen zu k ist NP-Hart (Subset Sum Problem) - also, diese Frage, wie auch. Und da willst du die aktuellen sets, scheint mir, dass brute Force Generierung aller Teilmengen ist der Weg zu gehen. (vielleicht fügen Sie einige Optimierungen unter Verwendung von branch-and-bound-Techniken, aber das ist über es, IMO)
  • Das Subset-Sum-Problem bezieht sich auf das finden einer Teilmenge, die Summen genau zu k, nicht mindestens k. Das finden einer Teilmenge, die Summen, um zumindest k ist O(n) (fügen Sie einfach alles-und sehen Sie, wenn die Summe groß genug ist).
  • Aber die Frage ist darum, ALLE Teilmengen, die größer/gleich k. Um dies zu tun, müssen Sie finden alle Teilmengen, die Summen zu k. Sie zu finden, ist NP-Schwer.
  • Sind Sie gerade auf der Suche nach einer Zählung aller Teilmengen, oder tatsächlich die Ausgabe der Menge von Teilmengen?
  • Wenn die zahlen positiv sind, Sie können prune gegen k - und max-Eingang. Wenn k<max, Pflaume alles >k. Wenn k>max prune jede wo in<max-k. Es ist immer noch exponentiell, aber n ist kleiner, das macht einen großen Unterschied in diesem Fall.
  • können Sie einige link, wo ich Lesen kann über den Ansatz, den Sie vorschlagen, im Grunde, wie zu lösen obiges problem, wenn die array-Größe ist klein (rund 40 Ganzzahlen), aber k ist eine große Anzahl

InformationsquelleAutor Hidetoshi | 2013-08-06
Schreibe einen Kommentar