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;}