興味深いことにDPのタイトル
原題:
確かに一般的な項目は、直接販売しました
リストレットは、bが開い価数であり、mは買うためにお金の量があります
B [i]は-a [I] <= mは、直接販売であります
そして、自然に考えて
1.コストの各項目が同じです
より魅力的なこのプロパティの外観
2.販売商品がないため、ちょうどオープンにどのような項目を検討
最初は偽のソリューションを考えた販売用のアイテムを忘れている何のためにはありません
そして、時にはクール、パッケージを開く3. [パッケージがクールされています
質問の核心
我々は、すべてのアイテムミートB [i]は-a [I]>メートルを売却開くことにしました注意してくださいするには
これらの記事はまた、その後> M [i]はbの満足します
あなたが開いているアイテムを持っている場合は、その価格の用語は、我々は次を開きます
1つの結合特性は、限り最初Dianqianオープン項目として、残りの項目は、スケジュール上で開くことが価値があります
パッドに十分なお金に問題の損失最小の前提
Dianqianのみ[I]を販売するための項目のいくつかは、[i]はB以降に販売されています
DPバックパック
初期値fの負の無限大であるが、F [共通項目とない価格と販売アイテムの価値] = 0
M + maxの{}のバックパックの容量(マットがまだ最大貨幣アイテム後に除去することができるので、これよりも大きいが、確かにコストはありません)
そして、お金節約示すために、この記事を取り、[I] -b [i]は、ぬいぐるみの内部に[i]は、リターンを計量アイテムを作ります
最大値にM M + maxの{}の最終チェック(重みが負であるため、最大重量損失は最小です)
Oの合計複雑さ(nm)と
これは、DPラベルで見つかった私の問題ですが、私はどんな考えを持っていないDPの様々なを開始したかったです
後の効果、列挙項目の順序、当時のアイテムのボリュームを購入するのに十分なお金を節約することができ、フロントに影響を与える項目は、直接販売されていない列挙するがあるので
(私は、とにかく、最初のi番目の記事前のDP Gaobuチェンを検討した後、効果のカウントを知りません)
最後は、実際には最初の自然を発見され、その後、DPは、問題のある子を解決します
非常に興味深いです
さて、この質問本当に悪い入力データ
幸いなことに、私は、学生が、文字列のように実施されること、処理していない、6読み取り処理と共演しました
コード:
1の#include <iostreamの> 2の#include <cstdioを> 3 使用して 名前空間をSTD。 4 CONST INT OO = 十億七。 5 INT N、M。 6 int型 A [ 11000 ]、B [ 11000 ]。 7 ブール FLG [ 11000 ]。 8 int型 F [ 21000 ]。 9 チャー S [ 11000 ]。 INT LTH; 10 INT メイン(){ 11 // freopenは( "ddd.in"、 "R"、STDIN)。 12 CIN >> N >> M。 13 のために(INT iが= 1 ; iが<= N; ++ I){ 14 // のscanf( "%D%D"、および[I]、および[I] B)。 15 CHAR CH = GETCHAR()。 16 一方(CH == ' \ n ' || CH == ' \ R ')CH = GETCHAR()。 17 LTH = 0 。 18 一方(CH =!' \ n ' && CH =!' \ R ' ){ 19 S [++ LTH] = CH。 CH = GETCHAR()。 21 } 22 BOOL FLG = 偽。 23 のために(INT J = 1 ; J <= LTH; ++ j)は{ 24 であれば(S [J] == ' ')FLG = 真。 25 他の 場合(FLG!)[I] = [I] * 10 + S [J] - ' 0 ' ; 26 他 B [I] = B [I] * 10 + S [J] - ' 0 ' 。 27 } 28 } 29 のintBWL = 0 ; 30 のために(INT iは= 1 ; iが<= N; ++ I){ 31 FLG [I] =(B [I] -a [I] <= M)。 32 であれば(FLG [i])とBWL + = [I]。 33 } 34 であれば(BWL> = M){ 35 のために(INT iは= 1 ; iが<= N; ++ i)があれば(FLG [i]が!)BWL + = B [I] - M。 36 のprintf(" %dの\ n " 、BWL)。 37 } 38 他{ 39 INT M = 20000; 40 のために(INT iは= 0 ; iが<= M; ++ I)F [I] = - OO。 41 [BWL] = F 0 。 42 のために(INT iが= 1 ; iが<= N; ++ i)があれば(!FLG [i])と 43 のための(INT J = M; J> = [I]; - j)はF [J] = MAX(F [J]、F [JA [I] + [I] -b [I] + M)。 // 注意M 44 INT MX = - OO。 45 のために(INT I = M; I <= M; ++ I)MX = MAX(MX、F [I])。 46 であれば(MX == - OO){ 47 のために(INT iは= 1 ; iが<= N; ++ i)があれば(FLG [i])とBWL + =![I]。 48 のprintf(" %dの\ n " 、BWL)。 49 } 50 他{ 51 のために(INT iは= 1 ; iが<= N; ++ i)があれば(FLG [i]が!)BWL + = B [i]は-m。 // 注意M 52 のprintf(" %dの\ n "、BWL + MX)。 53 } 54 } 55 リターン 0 。 56 }