Umaruシリーズの高い数(9) - ハスキー
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3358.html
制限時間:1000msのメモリ制限:65536 KiBの
問題の説明
ふざけすぎて、新鮮な毎日をキャットフードを食べたいが、巨大なのが多いいじめ多数の巨大上げニャーの星の数が多いので、巨人の高い数にいくつかのハスキー味の新鮮なを購入することを決めました。巨大な犬ハスキーを購入する中古市場の数が多いに来たその日は、巨人の高い数はハスキーのすべてを読んで、ハスキーは、すべての価格を降ろし、およびそれら愛らしい値を割り当てられた各へののれんの度合いに応じました。手の数が多いが、Xのドルを持っている今、彼女は頭のハスキー犬のいくつかの部分を購入することなど、多くの孟値を取得したいと思います。今、最大値までどのように多くの巨大な孟の高い数を求め、価格と高巨大な孟の数と彼のお金のXとNのハスキーの値を与えられました
入力
入力の複数のセット。
各入力のために、二つの整数N、X(1 <= N <= 100,1 <= X <= 1000)の最初の行があり、それぞれが巨大なハスキーお金の数との高い数を表します
二つの整数をそれぞれP1、マイル(1 <= Piを、ミ<= 100)、およびハスキー孟のi番目の値の価格の次のNライン
出力
各試験、行あたりの各出力で得られた巨大芽高い最大値の数を表す出力整数ため
サンプル入力
2 100 50 20 60 40 3 100 20 55 20 35 90 95 1 10 20 50
サンプル出力
40 95 0
ヒント
ソース
シャノン
アルゴリズムのアイデア:
この質問は、「アイテムの合計の最高値を選択する方法を、限られた容量のバックパックに。」それが、ある、明らかにナップザック問題です
この問題では、より多くの詳細な回答があり、アルゴリズムのコアは、「あなたは記事のバックパックを置きたい場合、私は、アイテムに直面して。」
私は確かにアイテムのコストはJを入れない負担するアイテムを置く、沈黙コストがあるだろう、各アイテムの重量があるので、費用と便益の比較はときの利点です:については、このアルゴリズムを理解し、我々は明確でなければなりませんコストよりも大きい場合、この記事では、バックパックに入れられます。
コアコード:
1 ための(int型 I = 0、I <N - 、Iは++){ // 記事の数格納 2 のための(INT K = Vと、K> = W [I]; K--){ // 所望の重量現在の体重 3。 DP [K] = MAX(DP [K]、DP [K - W [I] + P [I]); 4 } 。5 }
コードの解釈:
- 静的アドレスにナップザック問題を更新2次元配列さdp [i]の[j]を使用して多くの人々がありますが、2次元配列の使用は、より直感的な、しかし、一般的ではありません。
- 一次元配列を動的に更新するが、より広い範囲で、理解することがより困難と思われます。(例えば、コインの問題は、3重ループは一次元アレイを解決するために使用されてもよいが、二次元の場合、3次元に対応するように増加されなければなりません)
難易度:「K:V-> W [i]は、多い順に、」小から大への私たちのデフォルトでは、理解するのがより困難であり、かつ小型に大きな存在でなければならない、それ以外の場合は間違っています。
困難が答えます:
私たちは、本質は[]配列がでDPすることで、上記課題を生み出す
時
、その店の価値を理解していません。
我々はDPを比較している間、すべての更新開始のために、DP []店舗"には、この記事の前に置く最適解"である[k]とDP [K - [i]はW] +
P-を[i]は、前記DP [KW [i]は】前に最適な解決策です。
K>キロワット[i]が存在しなければならないので、あれば小型から大型まで、我々は最初とDP [k]はDPが更新されます[キロワットを[I]]は、につながるであろう比較的エラー。この時点DPにおける[KW [i]はこの値を基準に、さらにPに[i]が、その値は高い確率DP [K]よりも高くなる「の後に商品の最良値が配置」となっています、更新され、私たちの実際の意味から完全に逸脱、より多くのように。
以前に格納されているこのように、前後になるように過去の値(i番目の保留項目の値)を比較しているが、小から大へ、値をに更新される電流値を、それが置かれているが、我々は考えて、それがために入れた後、マルチ一度計算にされていないので、ポイントは何ですか。
ときに大きなアレイに小の第二ラウンドを使用した結果:
出典:
1つの#include " pch.h " 2の#include <iostreamの> 3の#include <アルゴリズム> 4 5 使用 名前空間STDを、 6 7 8 INT メイン(){ 9 int型N、V。 10 INT W [ 1001 ]、p個の[ 1001 ]。 11 一方(〜scanf_s(" %d個の%のD "、&N&V)){ 12 のための(int型 i = 0 ; iがn <; iは++ ){ 13 // |重量W P价值 14 scanf_s(" %のDの%のD "、&W [I]、およびP [I]); 15 } 16 // 空の配列 17。 INT DP [ 1001 ] = { 0 }; 18である ため(int型 I = 0 ;私は< N-; Iは++){ // ストアアイテムの数 19。 ための(INT K = V、K> = W [I]; K--){ // 現在の重量に必要な重量 20は 、最大= DP [K] (DP [K]、DP [K - [I] W] + P [I]); 21である } 22である } 23れます printf(" %d個の\ n " 、DP [V])。 24 } 25 }