HDU 1864 01背包

Posted 不离别不相遇、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于HDU 1864 01背包的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1864 01背包

HDU1864_最大报销额(背包/01背包)

HDU-1864&&HDU-2602(01背包问题)

HDU1864 最大报销额 01背包

hdu 1864 最大报销额01背包

hdu1864 最大报销额(01背包)