最大报销额

来源:互联网 发布:更相减损术算法 图 编辑:程序博客网 时间:2024/06/10 07:40

/*又一次做了一个所谓的01背包的题,给你一个固定的最大报销值,你能报销的值不能超过这个最大固定值。现在给你,很多报销单,问能报销的最大值(解释题意不给力)!很明显的01背包思想。上次我还在问,如果碰到浮点数怎么处理,今天就果断碰到一个浮点的01背包。果断只能加大数据,*100然后作为01整数背包处理!菜鸟解决一个水题,也感觉乐在其中。*/

#include <iostream>#include <cstdio>#include <iomanip>#include <cstdlib>#include <cstring>using namespace std;int dp[3100005],a[35];double deal(char s[]){double q=0;char sh[20];int l=strlen(s),k=0;for(int i=2;i<l;i++) sh[k++]=s[i];q=atof(sh);return q;}int main (){//freopen("z.txt","r",stdin);char str[20];int n,m,i,j,k;double s,t;while(cin>>s>>n){k=0;if(n==0) break;for(i=0;i<n;i++){int f=0,flag=0;double temp[3],tenp=0.0;memset(temp,0,sizeof(temp));for(cin>>m,j=0;j<m;j++){cin>>str;t=deal(str);if('C'<str[0]) flag=1;temp[str[0]-'A']+=t;}if(flag==0){                for(j=0;j<3;j++)                {                    tenp+=temp[j];                    if(temp[j]>600) f=1;                }                if(f!=1 && tenp<=1000.0) a[k++]=int(tenp*100.0);}}memset(dp,0,sizeof(dp));int weight=int(s*100);for(i=0;i<k;i++){for(j=weight;j>=a[i];j--)if(dp[j-a[i]]+a[i]>dp[j])dp[j]=dp[j-a[i]]+a[i];}for(j=weight;j>=0;j--)if(dp[j]>0) break;double res=dp[j]*1.0/100.0;cout<<setiosflags(ios::fixed)<<setprecision(2)<<res<<endl;}return 0;}