hdu 1864 最大报销额

题目

①:先判断n张发票中,有哪些是可以是报销的,可以报销的条件是( 同类不能超过600,每张发票不能超过1000,除了A,B,C之外类型的发票不能报销 ),并且计算出每张发票可以报销的总额。
②:初始化dp[0] = 0,表示都没有报销,外层循环遍历后续的发票,内层循环遍历当前发票之前的发票,判定如果报销发票满足输入能报销的最大额,就加上。
③:最后遍历一边dp数组,找出最大值就是解。
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 35;
int main()
{
    int i,j,num;
    char str,b;
    double w,A,B,C,data;
    double dp[maxn],m[maxn];
    int n;
    while(cin>>w>>n && n)
    {
        memset(dp,0,sizeof(dp));
        int cnt = 1;
        for(i=0; i<n; i++)
        {
            A = 0,B = 0,C = 0;
            cin >> num;
            int flag = 0;
            for(j=0; j<num; j++)
            {
                cin>>str>>b>>data;
                if(str == 'A')
                    A+=data;
                else if(str == 'B')
                    B+=data;
                else if(str == 'C')
                    C+=data;
                else
                    flag =1;
            }
            if(!flag && A<=600 && B<=600 && C<=600 && A+B+C <=1000 )
             {
                  m[cnt++] = A+B+C;
             }
        }

        for(i=1; i<cnt; i++)
        {
            for(j=i-1; j>=0; j--)
             {
                 if(dp[j] + m[i] <= w)
                    dp[i] = max(dp[i], dp[j]+m[i]);
             }
        }
        double Max = 0;
        for(i=1; i<cnt; i++)
        {
            if(dp[i] > Max)
                Max = dp[i];
        }
        printf("%.2lf
",Max);
    }

    return 0;
}

刚开始拿到这道题,觉得信息有点多,理了半天都理不清楚。要把一团乱麻理顺还真不容易。。。。
原文地址:https://www.cnblogs.com/qie-wei/p/10160247.html