HDU 1864 01背包、

这题题意有点坑阿、感觉特别模糊、

我开始有一点没理解清楚、就是报销的话是整张整张支票报销的、也是我傻逼了 没一点常识

还有一点就是说单张支票总额不超过1000,每张支票中单类总额不超过600,我开始以为是题目数据会这样给、 没想到还要自己判断

并且不符合条件的支票要直接舍去、- -、只能怪自己题目做少了、   没事还是好好刷题、   纵使别人放弃 我也不允许自己放弃

这题的输入数据全部都是2位小数,可以直接化为整数处理

然后就是裸的01背包了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int qq=5000000+50;
 7 int dp[qq];
 8 int p[qq];
 9 int main()
10 {
11     double tot;
12     int n;
13     while(~scanf("%lf%d",&tot,&n)&&n){
14         memset(dp,0,sizeof(dp));
15         int sum=(int)(tot*100);
16     //    printf("%d\n",sum);
17         int count=0,m;
18         double x;
19         char s;
20         for(int i=0;i<n;++i){
21             scanf("%d",&m);
22             int a,b,c,flag;
23             a=b=c=0;
24             flag=1;
25             for(int j=0;j<m;++j){
26                 scanf("%*c%c%*c%lf",&s,&x);
27                 int y=(int)(x*100);
28                 if(s=='A')    a+=y;
29                 else if(s=='B')    b+=y;
30                 else if(s=='C')    c+=y;
31                 else    flag=0;
32             }
33             if(a+b+c<=1e5 && a<=60000 && b<=60000 && c<=60000 && flag)
34                 p[count++]=a+b+c;
35         }
36         for(int i=0;i<count;++i)
37             for(int j=sum;j>=p[i];--j)
38                 dp[j]=max(dp[j],dp[j-p[i]]+p[i]);
39         printf("%.2lf\n",dp[sum]*1.0/100);
40     }
41     return 0;
42 }

 

posted @ 2016-04-05 23:36  我不萌、我要高冷  阅读(309)  评论(0编辑  收藏  举报