SDUT OJ 小P的故事——神奇的发票报销
小P的故事——神奇的发票报销
这道题测试点很奇怪,当发票类型不全是A,B,C时,该组的发票全部报废。这是这道题需要注意的一个点。
还有输入的时后要getchar一下,否则就会出错,不是很懂。
动态规划的01背包。
#include <iostream>
#include <cstring>
using namespace std;
int f[1000010], w[1010];
int main()
{
double n, p;
int m, r, t;
while(cin >> n >> m && m)
{
int q = n * 100, k = 0;
while(m--)
{
cin >> r;
int sum = 0, c1 = 0, c2 = 0, c3 = 0;
bool flag = 1;
while(r--)
{
getchar();
char e;
scanf("%c:%lf", &e, &p);
int o = 0;
if(e == 'A' || e == 'B' || e == 'C')
o = p * 100;
else
flag = 0;
if(e == 'A')
c1 += o;
if(e == 'B')
c2 += o;
if(e == 'C')
c3 += o;
}
if(c1 <= 60000)
sum += c1;
if(c2 <= 60000)
sum += c2;
if(c3 <= 60000)
sum += c3;
if(sum <= 100000 && flag)
w[k++] = sum;
}
for(int i = 0; i < k; i++)
{
for(int j = q; j >= w[i]; j--)
f[j] = max(f[j], f[j - w[i]] + w[i]);
}
printf("%.2lf\n", f[q] * 1.0 / 100);
memset(f, 0, sizeof f);
}
return 0;
}

浙公网安备 33010602011771号