ピギーバンクHDU - - 1114(フルバックパック)12個のテーマ別基礎DP1 Fを[Kuangbinは飛ぶためにあなたを取ります]

F -ピギーバンクHDU - 1114(フルバックパック)

トピックへのリンク:https://vjudge.net/contest/68966#problem/F

トピック:

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

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

InputThe入力は、Tテストケースから構成されています。それらの数(T)は、入力ファイルの最初の行に与えられています。各テストケースは、EおよびFは、それらが空豚のとコインで満たされた豚の体重を示す2つの整数を含む行から始まります。どちらの重みはグラム単位で与えられています。いいえ豚は1 <= E <= F <各テストケースの2行目に= 10000、数を与える整数N(1 <= Nが<= 500)が存在することを意味し、10kg以上の重量を量るません所与の通貨に使用される様々なコインの。これに続いてNライン、各指定ワンコインタイプが正確です。これらのラインは、二つの整数それぞれ、PAND Wを(1 <= P <= 50000、1 <= W <= 10000)を含有します。Pは、貨幣単位でコインの値であり、Wは、グラム重量だです。
各テストケースのための出力のうちの正確に1つの行をOutputPrint。行は、文が含まれている必要があり、「ピギーバンクにお金の最小量をXです。」Xは、与えられた総重量とコインを使用して達成することができるお金の最小量です。重量は正確に到達することができない場合は、「これは不可能です。」行を印刷します。
サンプル入力
3 
10 110 
2 
11 
30 50 
10 110 
2 
11 
50 30 
1 6 
2 
10 3 
20 4
サンプル出力
ピギー銀行にお金の最小量は60です
ピギー銀行にお金の最小量は100です
。これは不可能です。

質問の意味:まず、入力の最初の行試験の数、各テストケースと、最初の行はお金と貯金箱重量の完全な空の貯金箱の重量、及び、既存の貨幣の入力タイプの2行が含まれ、背中にはお金とお金の各値の重みです。あなたがそう印刷する見つけることができれば貯金箱で金の重量のための要件「にお金の最小量を、貯金箱の中で最も低い金額を見つけるために 、ピギーバンクX.である」 Xはコインの総重量に与えられ、あなたは最小量に達する可能性があります。あなたは正確に量を達成できない場合、これは「不可能..です
アイデア:完全なナップザック問題、詳細な知識がリンクを突くことができます。https://www.cnblogs.com/DJC-BLOG/p/9418438.html

// 
// 2019年8月4日に羽生によって作成されます。
//
する#include <アルゴリズム> 
書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <キュー> 
の#include < 設定 > 
書式#include <math.h>の
書式#include <マップ>
 使用して 名前空間はstd; 
typedefの長い 長いLL。
const  int型 MAXN = 1E5 + 7 #define MAX 0x3f3f3f3f
 INT のmain()
{ 
    int型N; 
    scanf関数(" %dの"N);
     ながら(N-- ){
         int型[MAXN]、B [MAXN]を、DP [MAXN]; 
        のmemset(DP、MAX、のsizeof (DP)); 
        DP [ 0 ] = 0 ;
         int型電子、F; 
        scanf関数(" %d個の%のD "、&​​E&F);
         int型の重量= F- E;
         int型のM; 
        scanf関数(" %のD "、&M)は、
         のためにint型 I = 1 ; I <= M ;私は++ 
        { 
            scanf関数(" %dの%のD "、および[I]、&B [I])。// 价值、B重量

        } 
        のためのint型 I = 1 ; I <= M; iは++ 
        { 
            ためINT J = B [i]は、J <=重量; J ++ 
            { 
                DP [J] =分(DP [ J]、DP [JB [i]は] + [I])を、
            } 
        } 
        もし(DP [重量] == MAX)
            のprintf(" これは不可能である\ N。" );
        
            のprintf(ピギーバンクのお金の最小量は%dです。\ nは、DP [重量])。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Vampire6/p/11300743.html