01バックパック-03 Pの物語-不思議な領収書清算
2729 ワード
Pちゃんの物語-不思議な領収書清算
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description
党の呼びかけに応えるため、Pさんのいる大学は現在、清算制度を厳格に規範化し、浪費を禁止している.特に以下の規定を行う:清算を許可する領収書のタイプは図書(A類)、文房具(B類)、出張(C類)を買うことを含んで、1枚の領収書の総額は1000元を超えてはいけないことを要求して、1枚の領収書の上で、単品の価値は600元を超えてはいけない.
今、先生はこの清算インボイスの重任をPさんに渡して、インボイスをあげて、清算できる、与えられた額を超えない最大の清算額を見つけさせます.Pさんは組織が彼に与えた任務を成功させることができますか?明らかにできないよ、、だから頼りにしなきゃ、、、
Input
テスト入力には、いくつかのテスト例が含まれます.
各試験例の第1行は、Qが所定の償還額であり、N(<=30)が請求書枚数である2つの正数QおよびNを含む.その後、N行入力であり、各行のフォーマットは以下の通りである.
m Type_1:price_1 Type_2:price_2 ... Type_m:price_m
このうち正の整数mはこの領収書に書いてあるものの件数で、Type_iとprice_iは第i項の物品の種類と価値である.
品物の種類は大文字と英語のアルファベットで表される.
Nが0の場合、すべての入力が終了し、対応する結果は出力されません.
Output
各テストケースに対して1行、すなわち清算可能な最大額を小数点以下2桁まで正確に出力します.
Sample Input
Sample Output
Hint
Source
xfl
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description
党の呼びかけに応えるため、Pさんのいる大学は現在、清算制度を厳格に規範化し、浪費を禁止している.特に以下の規定を行う:清算を許可する領収書のタイプは図書(A類)、文房具(B類)、出張(C類)を買うことを含んで、1枚の領収書の総額は1000元を超えてはいけないことを要求して、1枚の領収書の上で、単品の価値は600元を超えてはいけない.
今、先生はこの清算インボイスの重任をPさんに渡して、インボイスをあげて、清算できる、与えられた額を超えない最大の清算額を見つけさせます.Pさんは組織が彼に与えた任務を成功させることができますか?明らかにできないよ、、だから頼りにしなきゃ、、、
Input
テスト入力には、いくつかのテスト例が含まれます.
各試験例の第1行は、Qが所定の償還額であり、N(<=30)が請求書枚数である2つの正数QおよびNを含む.その後、N行入力であり、各行のフォーマットは以下の通りである.
m Type_1:price_1 Type_2:price_2 ... Type_m:price_m
このうち正の整数mはこの領収書に書いてあるものの件数で、Type_iとprice_iは第i項の物品の種類と価値である.
品物の種類は大文字と英語のアルファベットで表される.
Nが0の場合、すべての入力が終了し、対応する結果は出力されません.
Output
各テストケースに対して1行、すなわち清算可能な最大額を小数点以下2桁まで正確に出力します.
Sample Input
200.00 3
2 A:23.50 B:100.00
1 C:650.00
3 A:59.99 A:120.00 X:10.00
1200.00 2
2 B:600.00 A:400.00
1 C:200.50
1200.50 3
2 B:600.00 A:400.00
1 C:200.50
1 A:100.00
100.00 0
Sample Output
123.50
1000.00
1200.50
Hint
Source
xfl
#include
using namespace std;
int dp[3000001], vi[33];
int main()
{
double q, num, A, B, C;
int n;
char c;
while (~scanf("%lf %d", &q, &n) && n)
{
int Q = q * 100; // dp 100
memset(dp, 0, sizeof(dp));
memset(vi, 0, sizeof(vi));
for (int m = 0; m < n; m++)
{
int sum, k, flag = 1;
sum = A = B = C = 0;
scanf("%d", &k);
getchar(); //
for (int i = 0; i < k; i++)
{
scanf("%c:%lf", &c, &num);
getchar();
if (c == 'A')
A += num * 100;
else if (c == 'B')
B += num * 100;
else if (c == 'C')
C += num * 100;
else // ABC
flag = 0;
}
sum = A + B + C;
if (A > 60000 || B > 60000 || C > 60000)
flag = 0;
if (sum <= 100000 && flag) // 600 ABC
vi[m] = sum;
else
vi[m] = 0;
}
/*01 */
for (int i = 0; i < n; i++)
{
for (int j = Q; j > 0; j--)
{
if (j >= vi[i])
dp[j] = max(dp[j], dp[j - vi[i]] + vi[i]);
}
}
printf("%.2lf
", dp[Q] / 100.0);
}
return 0;
}