http://acm.hdu.edu.cn/showproblem.php?pid=1864
最大の償還
制限時間:1000分の1000 MS(Javaの/その他)メモリの制限:32768分の32768 K(Javaの/その他)
の合計提出(S):36208受理提出(S):11135
問題の説明
お金の既存の合計は、請求書の一定額を弁償することができます。請求書の種類は1000年を超えてはならない各請求書を必要とし、書籍(タイプ)、文具(クラスB)、総走行(Cタイプ)を購入することができ償還を含め、すべての請求書、以上$ 600の個々の項目の値ではなく。今、あなたは最大の償還クォータ度を超えないように、与えられた償還の請求書の山を見つけるためのプログラムを書きます。
入力
テスト入力には、いくつかのテストケースが含まれています。Qは、償還を与えられ、前記第一の試験の各行は、2つの正の番号QとNを含み、N(<= 30)は、請求書の数です。N行の入力に続いて、各ラインの形式である:
MのTYPE_1:PRICE_1 TYPE_2:price_2 ... Type_m:price_m
mは請求書、Type_i項目の種類によって開かれた部材についての正の整数であり、iがprice_i物品である、請求そして、値。大文字で表されるアイテムのカテゴリー。Nは、すべての入力端0である場合、出力結果を対応しません。
MのTYPE_1:PRICE_1 TYPE_2:price_2 ... Type_m:price_m
mは請求書、Type_i項目の種類によって開かれた部材についての正の整数であり、iがprice_i物品である、請求そして、値。大文字で表されるアイテムのカテゴリー。Nは、すべての入力端0である場合、出力結果を対応しません。
出力
各テストケースのための出力ラインは、すなわち、最大量は、2進の場所を弁償することができます。
サンプル入力
200.00 3 2 A:23.50 B:100.00 1 C:650.00 3 A:59.99:120.00 X:10.00 1200.00 2 2 B:600.00:400.00 1 C:200.50 1200.50 3 2 B:600.00:400.00 1 C:200.50 1 A:100.00 100.00 0
サンプル出力
123.50 1000.00 1200.50
ソース
推薦します
// の#include <ビット/ STDC ++。H> の#include <cstdioを> する#include <CStringの> する#include <cmath> の#include <アルゴリズム> の#include <iostreamの> する#include <アルゴリズム> の#include <iostreamの> する#include <cstdioを> 書式#include < 文字列 > の#include <CStringの> 書式#include <stdio.hに> する#include <キュー> の#include <スタック> の#include <マップ> 書式#include < セット > の#include <文字列の.h> の#include<ベクトル> #defineする ME(X、Y)のmemsetを(X、Y、はsizeof(X)) の#define SF(N)のscanf( "%d個"、&N) の#define担当者(I、N)のための(iはint型= 0; iがn <; iは++) の#define 0x3f3f3f3f INF の#define MOD十億七 の#define PIのACOS(-1)を 使用して 名前空間STDを、 typedefの長い 長いLL。 INT DP [ 3000009 ]、[W 30 ]。 INT メイン() { 二重 N。 ダブルV; しばらく(〜のscanf(" %のLFの%のLF "、&V、&N)&&N) { int型のフラグ。 memset(W 0、はsizeof (W))。 memsetの(DP、0、はsizeof (DP))。 以下のために(int型 i = 1 ; iが++; iが<= N ) { int型NUMと、 scanf関数(" %のD "、&NUM)。 フラグ = 1 。 INT X、Y、Z。 X = Y = Z = 0 。 以下のための(int型 J =1 ; J <= NUM; J ++ ) { ダブルヴァル。 チャーC、D。 CIN >> C >> D >> ヴァル。 ヴァル =ヴァル* 100 。 もし(C == ' ' && X +ヴァル<= 60000 ) { X + = ヴァル。 } そうなら(C == ' B ' && Y +ヴァル<= 60000 ) { Y + = ヴァル。 } そう なら(C == ' C ' && Z +ヴァル<= 60000 ) { Z + = ヴァル。 } 他 { フラグ = 0 。 } } もし、(X + Y + Z <= 100000 && フラグ) W [I] = X + Y + Z。 } INT VV = V * 100 。 以下のための(int型 I = 1 ; I <= N。私は++ ) { ため(INT J = VV; J> = W [I]; j-- ) { DP [J] = MAX(DP [J]、DP [JW I] + W [I])。 } } のprintf(" %.2lfする\ n "、(二重)DP [VV] / 100 )。 } 戻り 0 。 }