HDU 1864 01背包

来源:互联网 发布:李明老师讲linux视频 编辑:程序博客网 时间:2024/06/03 12:30
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=5000005;int f[maxn];int num[50];double q;int t;int main(){    int i,j,n,m;    double x;    int ta,tb,tc,r;    char c;    while(scanf("%lf%d",&q,&n),n)    {        int k=0;        while(n--)        {            ta=0,tb=0,tc=0;            scanf("%d",&m);            int flag=0;            while(m--)            {                scanf(" %c:%lf",&c,&x);//这里前面有一个空格输入,要记得,还可以这样输入scanf("%*c%c:%lf",&c,&x);                x*=100;                r=(int)x;//转换成整型                if(flag==0)                {                    if(c=='A'||c=='B'||c=='C')//保证 类型是在 A B C 三种类型中                    {                        if(c=='A')                        {                            if((ta+r)<=60000)//单项物品的价值不得超过600元                                ta+=r;                            else                                flag=1;//如果有一项超过了的话,那么这张发票就没有用,不能报销                        }                        if(c=='B')                        {                            if((tb+r)<=60000)                            {                                tb+=r;                            }                            else                                flag=1;                        }                        if(c=='C')                        {                            if((tc+r)<=60000)                            {                                tc+=r;                            }                            else                            {                                flag=1;                            }                        }                    }                    else                        flag=1;//如果有一种类型不是这三种中一种的话,那么这张发票也是没有用的                }            }            if(flag==0&&(ta+tb+tc)<=100000)//还有就是要求每张发票的总额不得超过1000元,不然这张发票也是没有用            {                num[k++]=(ta+tb+tc);            }        }        q*=100;        t=(int)q;        memset(f,0,sizeof(f));        for(i=0; i<k; i++)//这里就是01背包        {            for(j=t; j>=num[i]; j--)            {                f[j]=max(f[j],f[j-num[i]]+num[i]);            }        }        printf("%.2lf\n",f[t]/100.0);//这里我范了一下混吧,就是直接写成100没有写成100.0    }    return 0;}


原创粉丝点击