説明
以前は、3個のリンゴを持っている神秘的な庭は、各リンゴの数に制限はありません。庭に来た大きな袋を持つ少女があり、彼女は非常に多くのリンゴを見たことがなかったです。各りんごは女の子が最も利益を取得したい、販売のサイズと価格を持っているが、彼女はそれを行う方法を知りませんでした。そこで彼女が助けをあなたに来て、あなたはそれの最大値を取得するために彼女に言うことができますか?
入力
最初の行の整数T(Tは<= 50)、テスト・データ・セットの数を示します。
各試験は3行それぞれは、2つの整数S及びPを有する4本の線を有し、それぞれ(1 <= P <= 10000)各りんごの大きさ(1 <= S <= 100)と価格を表します
4行目は整数V(1 <= V <= 100,000,000)は袋の女の子の大きさを示しています。
出力
各試験群の最大値は、出力の数と少女は得ることができます。
サンプル入力
1 1 1 2 1 3 1 6
サンプル出力
ケース1:6
ヒント
バックパックの容量億が大きすぎ、1次元配列を開くことができませんです。
大半は、費用対効果の高いりんご、その(価格/重量)最大のリンゴをインストールするための能力に行きます。
バックパックの残容量がいっぱいリュックの小さな部分を使用します。
書式#include <iostreamの> の#include <アルゴリズム> 書式#include <CStringの> 使用して 名前空間はstdを、 const int型 INF = 0x3f3f3f3f 。 typedefの長い 長いLL。 構造体ノード{ LLのS、P。 ダブルV; }ノード[ 4 ]。 ブールCMP(ノードP、ノードq){ 戻り PV < QV。 } LL DP [ 1101 ]。 INT のmain() { int型、T、V、K = 0 。 cinを >> トン。 一方、(t-- ){ K ++ 。 以下のために(int型 i = 0 ; iは< 3 ; iは++ ){ CIN >>ノード[i]は.S >> ノード[i]は.P。 ノード[I] .V =ノード[I] .S * 1.0 / ノード[I] .P。 } CIN >> V。 ソート(ノード、ノード + 3 、CMP)。 LL ANS = 0 。 もし(V> 1000 ){ ANS =((V- 1000)/ノード[0 ]).S *ノード[ 0 ] .P。 V = 千 +(V- 1000年)%ノード[ 0 ] .S。 } のmemset(DP、0、はsizeof (DP))。 以下のために(int型 i = 0 ; iは< 3 ; iは++ ){ ため(LL用J =ノード[i]を.Sあり、j <= V; J ++ ){ DP [J] = MAX(DP [J]、DP [J-ノード[i]は.S] + ノード[I] .P)。 } } ANS + = DP [V]。 coutの << "場合" << K << " :" << ANS << ENDL; } 戻り 0 ; }