HDU 1864最大报销额(一维背包)

题目地址:HDU 1864

刚上来看着挺麻烦的。。仔细看了看原来好简单好简单。。。只要去掉一些不符合要求的发票,剩下的就是最简单的背包问题了。。对于小数问题,只要*100就变成整数了。

代码如下:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
using namespace std;
int dp[3000000], aa[40];
int main()
{
    double q,y, ans;
    int n, m,i,p ,j, x, flag, s, k, a, b, c;
    char ch;
    while(scanf("%lf%d",&q,&p)!=EOF&&p)
    {
        x=q*100;
        j=0;
        for(i=0; i<p; i++)
        {
            scanf("%d",&m);
            flag=0;
            s=0;
            a=b=c=0;
            while(m--)
            {
                getchar();
                scanf("%c:%lf",&ch,&y);
                if(ch=='A')
                {
                    a+=y*100;
                }
                else if(ch=='B')
                {
                    b+=y*100;
                }
                else if(ch=='C')
                {
                    c+=y*100;
                }
                else
                {
                    flag=1;
                }
                if(a>60000||b>60000||c>60000)
                    flag=1;
            }
            s=a+b+c;
            if(!flag&&s<=100000)
            {
                aa[j++]=s;
            }
        }
        memset(dp,0,sizeof(dp));
        for(i=0;i<j;i++)
        {
            for(k=x;k>=aa[i];k--)
            {
                dp[k]=max(dp[k],dp[k-aa[i]]+aa[i]);
            }
        }
        ans=dp[x]*1.0/100;
        printf("%.2lf\n",ans);
    }
    return 0;
}


你可能感兴趣的:(编程,算法,C语言,HDU,背包)