D - 最大报销额[01背包]
背包类型变成float型了,可以先放大后缩小来变成整形
#include<iostream> #include<string.h> #include<map> #include<stdio.h> #define MAX 3000010 using namespace std; int dp[MAX],bill[MAX]; double q,temp[4]; int N,ii,m; void Copy(double temp[]) { int flag=1;double sum=0; for(int i=0;i<3;++i) { if(temp[i]>600){flag=0;break;} sum+=temp[i]; } if(sum>1000)flag=0; if(flag) { bill[ii++]=(int)(sum*100); } } int main() { while(~scanf("%lf %d",&q,&N)) { if(N==0) break; int Q=(int)(q*100);//double化整形 memset(bill,0,sizeof(bill));ii=0; for(int nn=0;nn<N;++nn)//输入N个账单 { scanf("%d",&m);getchar(); memset(temp,0,sizeof(temp));int flag=1; for(int i=0;i<m;++i)//输入账单中的每个物品 { char t;double v; scanf("%c:%lf",&t,&v); getchar(); if('A'<=t&&t<='C'){ temp[t-'A']+=v;} else { flag=0; } } if(flag)Copy(temp);//保存合法的账单 } memset(dp,0,sizeof(dp)); for(int i=0;i<ii;++i) { for(int j=Q;j>=bill[i];j--) { dp[j]=max(dp[j],dp[j-bill[i]]+bill[i]); } } printf("%.2lf\n",dp[Q]/100.0); } return 0; }