638. Geschenkpaket

Im LeetCode Store gibt es viele Artikel zum Verkauf.

Es gibt jedoch auch einige Geschenkpakete, und jedes Geschenkpaket enthält eine Reihe von Artikeln zu einem günstigen Preis.

In Anbetracht des Preises für jeden Artikel enthält jedes Geschenkpaket eine Liste der Artikel und eine Liste der zu kaufenden Artikel. Bitte geben Sie die genauen Mindestkosten aus, um die ausstehende Liste zu vervollständigen.

Jedes Geschenkpaket wird durch einen Datensatz in einem Array beschrieben, die letzte Zahl gibt den Preis des Geschenkpakets an und die anderen Zahlen geben die Anzahl der anderen Arten von enthaltenen Gegenständen an.

Jedes Geschenkpaket kann unbegrenzt oft gekauft werden.

Beispiel 1:

Eingabe: [2,5], [[3,0,5], [1,2,10]], [3,2]
Ausgabe: 14
Erläuterung:
Es gibt zwei Elemente A und B, der Preis beträgt ¥ 2 und ¥ 5.
Spree 1 können Sie 3A und 0B für ¥ 5 kaufen.
Spree 2 können Sie 1A und 2B für 10 Yen kaufen.
Sie müssen 3 A und 2 B kaufen, also haben Sie 10 Yen für den Kauf von 1A und 2B (Geschenkpaket 2) und 4 Yen für den Kauf von 2A bezahlt.
Beispiel 2:

Eingabe: [2,3,4], [[1,1,0,4], [2,2,1,9]], [1,2,1]
Ausgabe: 11
Erläuterung:
A, B, C. Die Preise sind ¥ 2, ¥ 3, ¥ 4.
Sie können 1A und 1B mit ¥ 4 kaufen, oder Sie können 2A, 2B und 1C mit ¥ 9 kaufen.
Sie müssen 1A, 2B und 1C kaufen, also haben Sie 4 Yen für 1A und 1B (Geschenkpaket 1) und 3 Yen für 1B und 4 Yen für 1C bezahlt.
Sie können keine Artikel kaufen, die über die Liste der zu kaufenden Artikel hinausgehen, obwohl es billiger ist, den Spree 2 zu kaufen.

Hinweis:
Bis zu 6 Artikel und 100 Geschenkpakete.
Für jeden Artikel müssen Sie nur maximal 6 kaufen.
Sie können keine Artikel kaufen, die außerhalb der zu kaufenden Liste liegen, auch wenn sie billiger sind.

Quelle: LeetCode


Was sagt diese Frage, obwohl sie seit ungefähr einer Stunde geschrieben wurde, ist es wirklich eine Frage des unabhängigen Denkens und Abschlusses in der Mittelschule.
Schreiben Sie schnell über die Entstehung
dieser Frage : 1. Diese Frage sollte rekursiv sein. Wie löse ich die Rekursion?
2. Österreich, Sie müssen alle möglichen Lösungen rekursiv auflisten und die kleinste Antwort finden.
3. Wie schreibe ich mehrere Elemente der Rekursion?

  • Endbedingung: Kann nicht mehr kaufen, muss nur richtig sein. Später stellte sich heraus, dass es keinen Überschuss gab (alles, was Sie kaufen möchten).
    In der Mitte befindet sich ein Prozess, der über dieses zu lösende rekursive Problem nachdenkt : Kaufen Sie einfach alles . An hier zu denken ist eine plötzliche Erkenntnis, daher muss die Endbedingung sein, dass die Dinge aufgekauft werden. Zuerst habe ich über die Endbedingung der Rekursion nachgedacht, aber ich habe nicht an das eigentliche Problem gedacht, das durch diese Rekursion gelöst wurde. Abweichend von der Realität. Denken Sie das nächste Mal darüber nach, inwieweit ich es getan habe, bevor ich es nicht getan habe .
  • Betreff: Das Thema muss Einkaufen sein
    • Kaufen Sie zuerst einen Spree und dann ein einzelnes Produkt.
    • Kaufen Sie einen Spree, um zu sehen, ob Sie ihn kaufen können. Kann kaufen, rekursiv, kann nicht kaufen, siehe das nächste große Geschenkpaket.
    • Überprüfen Sie abschließend, ob freie Stellen vorhanden sind, und kaufen Sie die nicht verkauften Artikel.
    • Nach dem Schreiben zögern, sollte es das 优先级 (当时理解成代码的执行顺序 )gleiche sein wie das Geschenkpaket und sollte zusammengestellt werden. Dann habe ich nochmal darüber nachgedacht, das Geschenkpaket muss rabattiert werden.

4. Als schließlich festgestellt wurde, dass die Antwort falsch ist, stellte sich heraus, dass die mittlere Variable falsch ist (ans- = special [i] [j]; es gibt keine solche Zeile). Geändert und erfolgreich.
Fügen Sie schließlich bezüglich des Prioritätsproblems ans- = special [i] [j] hinzu und denken Sie dann darüber nach, damit die Priorität dieselbe ist. Das Verständnis ist jetzt, dass alle die Möglichkeit haben, es zu kaufen.
Oder ändern Sie es einfach dfs(price,special,needs,ans+special[i][j]).

int eans=0x3f3f3f3f;
    int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
      
        dfs(price,special,needs,0);
        return eans;
    }
    void dfs(vector<int>& price, vector<vector<int>>& special, vector<int>& needs,int ans){
        int flag=0;
        for(auto a:needs){
            flag+=a;
        }
        if(flag==0){
            eans=min(ans,eans);
            return;
        } 
        //需要的  都  买完了。所以结束递归,返回价钱。

        //开始买大礼包
        for(int i=0;i<special.size();i++){
            //看看大礼包能不能买,不能买的的话,看下一个大礼包
            int flag1=true;
            int j;
            for(j=0;j<needs.size();j++){
                if(special[i][j]>needs[j]) {
                    flag1=false;
                    break;
                }
            }

            //要是可以买大礼包,则递归
            if(flag1){
                ans+=special[i][j];//把大礼包的价钱加上
                for(j=0;j<special[i].size()-1;j++) needs[j]-=special[i][j];//把需求减去
                dfs(price,special,needs,ans);//继续看下一个礼包,
                //递归之后,需要需求加回来
                for(j=0;j<special[i].size()-1;j++) needs[j]+=special[i][j];
                ans-=special[i][j];//把大礼包的价钱减去
            }
        }
        //大礼包买完了,开始买单价商品
        vector<int>tep=needs;
        int tepp=0;
        for(int i=0;i<needs.size();i++){
            if(needs[i]!=0){
                tepp+=needs[i]*price[i];
                needs[i]=0;
            }
        }
        ans+=tepp;
        //cout<<ans<<endl;
        dfs(price,special,needs,ans);
        needs=tep;
        ans-=tepp;
    }
Veröffentlicht 161 Originalartikel · Gefällt mir 68 · Besucher 20.000+

Ich denke du magst

Origin blog.csdn.net/qq_43179428/article/details/104310922
Empfohlen
Rangfolge