Probleme beim Entwerfen der Rekursion mit begrenzten Ergebnissen

8

Ich habe Probleme, dieses Problem zu beheben. Es hat mich seit gestern geplagt (sorry, ich habe das früher gepostet und dann gelöscht, weil ich dachte, dass ich es gelöst habe, aber es stellte sich heraus, dass es ein weiterer Bug war, den ich behoben habe). Ich versuche, einfach eine Liste mit Elementen und einem Bereich zu erstellen und Kombinationen zu finden, die es ermöglichen, alle Elemente zu verwenden.

Hier ist ein Beispiel: Stellen Sie sich vor, Sie hätten 4 Artikel (Apfel, Birne, Pfirsich und Orange) und möchten, dass mindestens 20% des Korbes und maximal 60% enthalten sind. Zum Beispiel könnten Sie 25%, 25%, 25%, 25% von jedem Artikel oder 30%, 30%, 20%, 20% usw. haben, aber 0%, 0%, 50%, 50% nicht arbeiten, weil die angegebene min% 20% ist.

Das Programm funktioniert gut, aber es verwendet weniger Elemente als die gesamte Liste (statt 4 Elemente in jeder Lösung enthalten einige Lösungen 2 oder 3 Elemente, was nicht das ist, was ich möchte). Wenn ich eine Liste von 4 Elementen sende, möchte ich die Kombinationen mit allen 4 Elementen zusammen und nicht weniger. Ich will das nicht, weil ich vorhabe, große Listen zu verwenden, und ich möchte, dass die Größe verwendet wird, um nur alles zu sein und nicht weniger als das min%. Hier ist ein Beispiel mit den obigen Informationen (4 Elemente, 20-60% Reichweite):

%Vor%

Ich bin wirklich verwirrt darüber, warum dies passiert, aber wenn ich wetten müsste, würde ich denken, dass meine Rekursion die Anzahl der Elemente in der Liste nimmt und eins subtrahiert, bevor ich sie zurückschicke. Es ist in der Methode recursion_part :

%Vor%

Ich möchte an größeren Listen arbeiten und ich denke, es wird ein Problem sein, wenn es viele Ergebnisse berechnet, die mir egal sind. Wie kann ich das so umgestalten, dass nur alle Einträge in der Liste bearbeitet werden und innerhalb der Bereichsgrenzen bleiben?

Ich dachte über eine Methode nach, die prüft, wie viele Nullen es in der Liste gibt, und bricht dann, wenn sie unter die Größe der Liste fällt, aber die Tatsache, dass ich leere Ergebnisse erhalte, bedeutet, dass sie weniger verarbeitet als meine Liste und ich denke, es ist besser, das Programm so zu entwerfen, dass es keine Ressourcen verschwendet.

Hier ist der gesamte Code (er funktioniert wie beschrieben, gibt aber wie erwähnt null Ergebnisse):

%Vor%

Danke, und wenn es einen besseren Weg gibt, um das Ergebnis zu erreichen, das ich suche, lassen Sie es mich wissen.

ps. das sind keine Hausaufgaben und ich bin kein Student; Ich habe nur eine Tendenz, seltsam klingende Proxy-Probleme zu finden.

Bearbeiten : Ich habe den gesamten Code eingefügt, aber hier ist auch die Ausgabe . Es ist ein Ausschnitt der 2653-Lösungen, die mehr generieren, als ich brauche. Wenn Sie es kurz betrachten, werden Sie sehen, dass die meisten korrekt sind, aber wenn Sie niedriger werden, werden Sie sehen, dass nicht alle Werte verwendet werden. Ich möchte nur die Lösungen, die alle Werte verwenden; es sollte keine 0 Werteinträge geben.

    
Lostsoul 25.05.2012, 19:09
quelle

1 Antwort

7
%Vor%

Lange Variablennamen sind besser, wenn sie klarer sind als kurze. Aber sie sind per se nicht wertvoller.

Mehr noch: Bleiben Sie bei den Namenskonventionen, die CamelCase in Java sind, not_funky_underlines.

Okay - warum sollten Low und High statisch sein? Ich habe mich in dieser Richtung nicht für "Namen" und "Ergebnis" entschieden. Bleibt als Übung, um den statischen Modifikator zu entfernen.

Okay - mein Eindruck ist, dass die Summe immer 100, nicht weniger als 100 sein muss. Wenn also 4x20% das Minimum ist, ist ein Maximum von 60% nicht möglich. Aber ich verstehe, dass die Werte variabel sind, und in anderen Einstellungen könnten Sie mindestens 4x10% haben, und dann wären maximal 60% sinnvoll. Ich habe den Code für diesen Zweck nicht getestet.

Aber ich subtrahiere das Minimum (4 * 20%) vom Rest, um zu verteilen, also müssen Sie diese Werte für das Endergebnis hinzufügen.

Die rekursive Verteilungsfunktion beginnt mit der Abbruchbedingung: Das letzte Element ist erreicht. Jetzt muss der Rest - wie viel es sein könnte - für dieses letzte Element verwendet werden.

Ansonsten nehmen Sie alle möglichen Werte für dieses Element und verteilen den Rest.

update:

Ich habe den Code geändert, um auf die Obergrenze zu achten, und das Beispiel auf der einen Seite vereinfacht, da es jetzt nur noch 3 Elemente und maximal 10 anstelle von 100 verwendet. Die Ausgabe zeigt die reellen Werte (min + Variable Teil) und der Algorithmus fügt nur Lösungen hinzu, die nicht die Obergrenze der Beschränkung verletzen.

Beispielausgabe:

%Vor%     
user unknown 25.05.2012, 20:40
quelle

Tags und Links