638.ギフトパッケージ

LeetCodeストアでは、多くの商品が販売されています。

ただし、ギフトパッケージもいくつかあり、各ギフトパッケージにはお得な価格でアイテムのセットがバンドルされています。

各アイテムの価格を考えると、各ギフトパッケージには、アイテムのリストと購入するアイテムのリストが含まれています。保留リストを完了するための正確な最小コストを出力してください。

各ギフトパッケージは配列内のデータのセットによって記述され、最後の数字はギフトパッケージの価格を表し、他の数字は含まれている他の種類のアイテムの数を示します。

ギフトパックは何回でも購入できます。

例1:

入力:[2,5]、[[3,0,5]、[1,2,10]]、[3,2]
出力:14
説明:
2つのアイテムAとBがあり、価格は¥2と¥5。
Spree 1、¥5で3Aと0Bを購入できます。
Spree 2は、1Aと2Bを¥10で購入できます。
3 Aと2 Bを購入する必要があるため、1Aと2B(ギフトパック2)を購入するには¥10、2Aを購入するには¥4を支払いました。
例2:

入力:[2,3,4]、[[1,1,0,4]、[2,2,1,9]]、[1,2,1]
出力:11
説明:
A、B、C価格は2円、3円、4円
。1A、1Bは4円で、2A、2B、1Cは9円で買える。
1A、2B、1Cを購入する必要があるため、1Aと1B(ギフトパック1)に4円、1Bに3円、1Cに4円を支払いました。
酒宴を購入する方が安くなりますが、購入予定リストを超えるアイテムを購入することはできません。

注:
最大6個のアイテムと100個のギフトパッケージ。
各アイテムにつき、最大6つまで購入する必要があります。
価格が安くても、リストにないものは購入できません。

出典:LeetCode


この質問の意味は、1時間ほど書かれていますが、実際には中学校での独立した思考と修了の問題です。この質問
の構成についてすぐに書いて
ください。1.この質問は再帰的である必要があります。再帰を解決する方法は?
2.オーストリア、すべての可能な解決策を再帰的にリストし、最小の答えを見つける必要があります。
3.再帰のいくつかの要素をどのように書くか?

  • 終了条件:これ以上購入できず、正しいことが必要です。その後、余剰がないようになりました(購入したいすべて)。
    考えているプロセスの途中、この再帰的な問題を解決すべきライン上のものを購入しますここで考えるのは突然の気づきなので、最終的には物を買わなければならない。最初は再帰の終了条件について考えましたが、この再帰によって解決される実際の問題については考えていませんでした。現実から逸脱した。次回は、やらない前にやったことを考えてみてください
  • 件名:テーマはショッピングである必要があります
    • 最初に酒を購入し、次に単一の製品を購入します。
    • あなたがそれを買うことができるかどうか確かめるために酒宴を買ってください。購入できる、再帰的、購入できない、次の大きなギフトパッケージを見る。
    • 最後に、欠員がないか確認し、売れ残りの商品を購入します。
    • 書いた後でためらいましたが优先级 (当时理解成代码的执行顺序 )ギフトパッケージと同じで、まとめる必要があります。それからもう一度考えてみましたが、ギフトパッケージは割り引かなければなりません。

4.最後に、答えが間違っていることがわかりました。中央の変数が間違っていることがわかりました(ans- =特殊[i] [j]、そのような行はありません)。変更して成功しました。
最後に、優先順位の問題について、ans- = special [i] [j]を追加して考えてみましょう。優先順位は同じです。今の理解は、すべてがそれを購入する機会を持っているということです。
または単にそれを変更し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;
    }
161のオリジナル記事を公開 68のような 訪問者20,000以上

おすすめ

転載: blog.csdn.net/qq_43179428/article/details/104310922