深さ優先探索&テーマ別-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)。 } } }