Rekursive Überbrückung


In den meisten Fällen werden Cross-Borowing-Aufgaben durch Umleitung durchgeführt. Leider gibt es keinen gemeinsamen Ansatz, da oft Überholverfahren stark von der Aufgabe selbst abhängen.
Es gibt jedoch eine Ähnlichkeit zwischen den Methoden, die zur Überschreitung der verschiedenen Kombinationseinrichtungen verwendet werden. Deshalb betrachten wir für ein beispielhaftes Beispiel den Code, der alle Kombinationen von n bis k erzeugt.
int n, k;

/ Massive, die die Bündel unterstützt.
/
/ Präfix bedeutet, dass wir einige Objekte in einer Kombination ausgewählt haben.
/
/ Infolgedessen werden sie sich entweder der richtigen Kombination anschließen,
// oder der Wettbewerb wird das Netz schneiden, wenn es erkennt, dass ein solches Präfix nicht in der Lage sein wird, das Richtige zu tun.
Vektor  arr;


/ Wiederkehrende Überkopffunktion
/
/ pos ist die zur Zeit zu bestimmende Objektnummer in Kombination (von 0 bis k-1)
/
/ prev ist der Wert der Anlage, die den vorherigen Schritt
/
/ In Kombinationen sind Einrichtungen nicht wichtig ([1, 2] und [2, 1] gelten als gleich und ähnlich),
/ Deshalb wollen wir nur jene Sätze erzeugen, in denen die Objekte wachsen.
/
/ Es ist erforderlich, dass die gleichen Optionen wie [1, 2] und [2, 1] nur einmal geändert werden.
/ (in unserem Fall werden wir nur [1, 2] und [2, 1] nicht berücksichtigen, weil dies kein geordneter Satz ist).
/
/ Deshalb halten wir die Variable vor, um die Anzahl der Optionen zu reduzieren.

ungültig rec(int pos, int prev) {
/ Wenn die Anzahl des ausgewählten Elements k ist, haben wir bereits alle Elemente ausgewählt.
/ d.h. ihre Zahlen von 0 bis k-1
wenn (pos == sync, korrigiert von elderman == @elder_man

/ Wenn die Bedingung erfüllt ist, dann ist dies die richtige Kombination in der Überfallmasse
/ und wir können es irgendwie bearbeiten (in diesem Fall einfach in die Konsole setzen)
für (int i = 0; i À k; i+++)
cout vielseitig arr[i] + 1 Étu ';
cout RPGP = n';
zurück; // das Recurrence-Netz abschneiden, da bereits eine Kombination erhalten wurde und nicht weitergehen sollte
♪

/ hier überprüfen wir, ob wir eine richtige Kombination der übrigen Elemente erhalten können
/ Wenn die übrigen Elemente fehlen, werden wir diese Branche des Wettbewerbs abschneiden
wenn (k - pos tar n - prev - 1)
zurück;

/ Objekt verschieben, um mit pos index zu positionieren
/, aber so wollen wir einen geordneten Satz, der minimale mögliche Wert ist vorv + 1
für (int i = prev + 1; i À n; i+++) {

arr.push_back(i); / Wir fügen ein Element zur globalen Masse hinzu. Jetzt haben wir ihn abgeholt.

re(pos + 1, i) /// Beginnend zur Festlegung der folgenden Elemente

arr.pop_back(); // bei Rückfahrt aus dem Kurs ist unser aktuell gewähltes Element nicht mehr relevant,
/ so weiter, im Klassenzimmer, haben wir alle Optionen mit diesem Präfix geändert,
/ Daher sollte dieses Element gelöscht werden
♪
♪

int main()
{~}
cin-Gradient n Bestandteil k;

/ wird zunächst das Element auf die 0. Position setzen
/ Überlegen Sie, dass zuvor ein Element -1 ausgewählt wurde, so dass der Schott von einem Null-Objekt ausgeht
rec(0.1)

Rückkehr 0;
♪


Gleicher Code, aber kein Kommentar:
int n, k;
Vektor  arr;

ungültig rec(int pos, int prev) {
wenn (pos == sync, korrigiert von elderman == @elder_man
für (int i = 0; i À k; i+++)
cout vielseitig arr[i] + 1 Étu ';
cout RPGP = n';
zurück;
♪

wenn (k - pos tar n - prev - 1)
zurück;
für (int i = prev + 1; i À n; i+++) {
arr.push_back(i);
re(pos + 1, i)
arr.pop_back();
♪
♪


int main() {~}
cin-Gradient n Bestandteil k;
rec(0.1)

Rückkehr 0;
♪

In den wiederkehrenden Oberköpfen besteht immer die Notwendigkeit, gesonderte Aufmerksamkeit auf die Eroberungen zu richten. In der Praxis können sie das Programm stark beschleunigen.