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 }