深さ優先探索&テーマ別-638をバックトラックのLeetcode。シュプレー(ショッピングオファー)

深さ優先探索&テーマ別-638をバックトラックのLeetcode。シュプレー(ショッピングオファー)

問題解決の深さ優先探索の詳細、クリックしてください


 

LeetCode店では、販売中の多くの項目があります。

しかし、いくつかの酒宴、記事のグループを束ねる価格のため、各まくるがあります。

各項目の現在のリストの価格を考えると、各ギフトパッケージはアイテムだけでなく、なるように、あなたの購入のリストが含まれています。希望リストの正確なコストの最小出力を完了してください。

各パッケージは、大きなアレイは、データの集合によって記述される、最後の番号が大きいパッケージの価格を表し、他のデジタルアイテムの他のタイプの数は、図に含まれています。

どれまくるは無制限購入することができます。

実施例 1 

入力:[ 2,5]、[3,0,5]、[1,2,10]、[3,2 ] 
出力: 14 
説明:
AとBの二つの財の価格¥2、¥ 5 
シュプレー、あなたは¥5の3Aおよび0B価格を購入することができます。
シュプレー2は、あなたは、¥10の価格で1Aと2Bを購入することができます。
あなたは3 A及びB 2を購入する必要があるので、あなたは後で1Aと2B(まくる2),. 4以降¥2A用¥10を支払います。
実施例 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を購入することができ、また¥9と図2A、図2B、及び図1Cを購入することができます。
あなたは¥4は、図1Aおよび図1B(まくる)を購入し、¥3購入1B、¥4購入1C支払うので、1A、2Bおよび図1Cを購入する必要があります。
あなたは安いまくる2を購入するものの、項目のウィッシュリストを超えて購入することはできません。
説明:

商品の6種類、100種類まくるまで。
各項目は、あなただけの6の最大値を購入する必要があります。
あなたは、アイテムの希望リストを超えても、安く購入することはできません。

 

分析:

与えられたN個の商品は、数が最低価格を購入する方法を見つける必要がM N + 1ののパックの長さが与えられ、各項目を保存するためにNリストの長さを与えられました。

例例1を参照してください。

この問題は、に変換することができます。

1、最初に私が最も少数のパックで購入できることがわかりますか?

最大にパッケージ0注文書を購入2、倍の0-最大数は、購入するサイクル、

  たとえば、私は2つまで購入することができますパッケージは、その後、私DFSは、以下のステップに入りました。

  •   > B後のパック - 後で0用のパッケージ
  •   後で1用のパッケージ - >以降のBはパック
  •   後で2のパッケージ - >以降のBはパック

図3は、リストのサイクルパックの一番最後に、行方不明、及び商品の不足、その単価はそれを購入している製品を確認してください。

4、および最後に、合計金額を算出し、最小値を求めます。

 

ACコード:

クラスソリューション{
     INT ANS = Integer.MAX_VALUEで、
    公共 int型 shoppingOffers(一覧<整数>価格、リスト<リスト<Integer型>>特別、一覧<整数> ニーズ){
         場合(price.size()== 0 ||価格== nullのリターン 0 ; 
        DFS(価格、特別、ニーズ、 0,0 );
        戻るANSを。
    } 
    パブリック 無効 DFS(一覧<整数>価格、リスト<リスト<Integer型>>特別、一覧<整数>ニーズ、int型のステップ、int型のお金){
         場合(ステップ> = {special.size())
             についてint型 i = 0; iがneeds.size()を<; Iは++ ){ 
                お金 + = needs.get(I)* price.get(I)。
            } 
            ANS = Math.min(ANS、お金)。
            返します
        } 
        
        リスト <整数>パック= special.get(ステップ)。
        int型値= pack.get(pack.size() - 1 )。
        int型 MAXNUM = Integer.MAX_VALUEで、
        以下のためにint型 i = 0; i)は(needs.sizeを<; iは++ ){
             場合(!pack.get(I)= 0 ){
                 int型 TEMP = needs.get(I)/pack.get(I); 
                MAXNUM = Math.min(MAXNUM、TEMP)。
            } 
        } 
        のためにint型 i = 0; I <= MAXNUM; iは++ ){ 
            リスト <整数> TEMP = 新規のArrayList <> ニーズ)。
            INT J = 0; J <needs.size(); J ++ ){ 
                needs.set(J、needs.get(J) -i * pack.get(J))。
            } 
            int型のコスト=私は* 値を、
            もし(お金+コスト< ANS){ 
                DFS(価格、特別なニーズ、ステップ + 1、お金+ コスト)。
            }
            ニーズ = 新しい ArrayListを<> (TEMP)。
        } 
        
        
    } 
}

 

おすすめ

転載: www.cnblogs.com/qinyuguan/p/11358029.html