首页 > 代码库 > HDU 1864 最大报销额

HDU 1864 最大报销额

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864

 

思路:01背包问题。。。我感觉难点不在01背包上,而在输入数据的处理上。。题目指的是一类的数量不大于600....不知道这个估计得一直wa、

 

 

代码:

#include <iostream>#include <cstring>#include <cstdio>using namespace std;double dp[1000];double danjia[1000];int main(){    double q;    int n;    int flag;    int all;    while(cin>>q>>n&&n)    {        all = 0;        memset(dp, 0, sizeof(dp));        for(int k = 1; k<= n; k++)        {            int num;            cin>>num;            getchar();            char ct;            double t;            double A = 0,B = 0,C = 0;            for(int i=0; i<num; i++)            {                flag = 0;                scanf("%c",&ct);                getchar();                if(ct == A)                {                    cin>>t;                    A+=t;                }                else if(ct==B)                {                    cin>>t;                    B+=t;                }                else if(ct == C)                {                    cin>>t;                    C+= t;                }                else                {                    cin>>t;                    flag = 1;                }                if( i != num-1)                    getchar();            }                        if(A>600 || B> 600 || C > 600 || flag == 1 || A+B+C >1000)            {                continue;            }            danjia[all++] = A+B+C;                }                        for(int i=0; i<=all-1; i++)        {            for(int j = all; j >=1; j--)            {                dp[j] = max(dp[j], dp[j - 1] + danjia[i]);            }        }                for(int i = all; i>=0; i--)        {            if(dp[i]<=q)            {                printf("%.2f\n",dp[i]);                break;            }        }    }    return 0;}

 

HDU 1864 最大报销额