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;
}
posted @ 2022-04-22 21:29  Flying_bullet  阅读(57)  评论(0)    收藏  举报