Day9 - D - ピギーバンクPOJ - 1384

ACMは何かを行うことができます前に、予算を準備する必要があり、必要な財政支援を求めます。このアクションの主な収入は、不可逆的にバウンドマネー(IBM)から来ています。アイデアの背後には簡単です。いくつかのACMのメンバーはどんな小さなお金を持っているときはいつでも、彼はすべてのコインを取り、ピギーバンクにそれらをスローします。あなたは、このプロセスは不可逆的であることを知って、コインは豚を壊すことなく削除することはできません。十分に長い時間が経過した後、ニーズが支払われることにすべてを支払うためにピギーバンクに十分な現金があるはずです。

しかし、ピギー銀行との大きな問題があります。内部でどのくらいのお金を決定することはできません。だから我々は唯一の十分なお金がないことを見つけるために粉々に豚を壊すかもしれません。明らかに、我々はこの不愉快な状況を回避したいです。唯一の可能性はピギーバンクを量るとコインが内部にあるどのように多くの推測しようとすることです。我々は正確に豚の重量を決定することができると仮定し、私たちは、与えられた通貨のすべての硬貨の重みを知っています。そして、お金のいくつかの最小量は、我々が保証できることをピギーバンクにあります。あなたの仕事は、この最悪のケースを見つけるとピギーバンク内の現金の最小量を決定することです。君の力が必要なんだ。これ以上早まっ豚を破ら!

入力

入力は、Tテストケースから構成されています。それらの数(T)は、入力ファイルの最初の行に与えられています。各テストケースは、EおよびFは、それらが空豚のとコインで満たされた豚の体重を示す2つの整数を含む行から始まります。どちらの重みはグラム単位で与えられています。いいえ豚手段各テストケースの2行目に1 <= E <= F <= 10000、数を与える整数N(= 500 1 <= Nが<)があることを、10kg以上の重量を量るません所与の通貨に使用される様々なコインの。これに続いてNライン、各指定ワンコインタイプが正確です。これらのラインは、二つの整数それぞれ、PAND Wを(1 <= P <= 50000、1 <= W <= 10000)を含有します。Pは、貨幣単位でコインの値であり、Wはグラムでの重量です。

出力

各テストケースのために、正確に出力の1行を印刷します。文を含んでいなければならないライン「ピギーバンクにお金の最小量はXです。」Xは、与えられた総重量とコインを使用して達成することができるお金の最小量です。重量は正確に到達することができない場合は、「これは不可能です。」行を印刷します。

サンプル入力

3 
10 110 
2 
11 
30 50 
10 110 
2 
11 
50 30 
1 6 
2 
10 3 
20 4

サンプル出力

マネーの最小量の60 AピギーバンクIS 
100 ISにピギーバンク最低金額の
これは不可能です。

アイデア:完全ナップザック問題、DP [i] [j]が重量で、前に私のコインを表しjが最小値が最も直感的な、DPの場合を例にとり、到達している[I] [J] =分(DP [I-1] [JK * W] + K * C)(0 <= K <= J / W) しかし、この式は、[I] [JW] DP計算[I-1] [JWN DPを計算する際に、例えば、計算を繰り返したワット/ + N * C(1 <= N <=(J W *]を)-1)、すなわち、1 <時間= Kなど、計算DP [i]が[j]が唯一の(時間分をカウントする必要がある場合、DP [I-1]〜 [J]、DP [I] [JW] )、[JW] [i]はDPに対応することができ、1 <= k個の答えが出てカウントした、そして次にアレイを圧延することに最適化することができます
const  int型 INF = 0x3f3f3f3f 

INT DP [ 10005 ]、W [ 505 ]、C [ 505 ]。

INT メイン(){ 
    IOS :: sync_with_stdio()、cin.tie(0 )。
    int型T; 
    CIN >> T;
    一方、(T-- ){
         int型E、F、V、N。
        CIN >> E >> F >> N。
        V = F - E;
        以下のためにINT iが= 1 ; iが<= Vと、++ I)DP [I] = INF。
        にとってINT I = 1 ; I <= N; ++ I)CIN >> C [I] >> [I] W。
        以下のためにINT iが= 1 ; I <= N; ++ I){
             ためINT J = W [i]は、J <= V; ++ j)は
                DP [J] =分(DP [J]、DP [ JW [I] + C [I])。
        } 
        場合(DP [V] <INF)COUT << " ピギーバンクマネーの最小量は、" << DP [V] << " \ N。" 他の裁判所未満<< これは不可能です\ nは。;
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/GRedComeT/p/12236394.html