标签:
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
总结
感觉自己对dp确实还不熟,还是多做做题吧
#include<iostream> #include<cstdio> #include<cstring> using namespace std; double dp[3000050]; int main() { double q; int n=1,money[35],sum; while(~scanf("%lf %d",&q,&n),n){ int a,b,c,l=0; memset(dp,0,sizeof(dp)); memset(money,0,sizeof(money)); sum=(int)(q*100); for(int i=1;i<=n;i++){ int k,flag=1,v; double y; char ch; a=b=c=0; scanf("%d",&k); while(k--){ scanf(" %c:%lf",&ch,&y); v=(int)(y*100); if(ch==‘A‘&&a+v<=60000) a+=v; else if(ch==‘B‘&&b+v<=60000) b+=v; else if(ch==‘C‘&&c+v<=60000) c+=v; else flag=0; } if(a+b+c<=100000&&a<=60000&&b<=60000&&c<=600000&&flag) money[l++]=a+b+c; } int i,j; for(i=0;i<=l;i++){ for(j=sum;j>=money[i];j--) dp[j]=max(dp[j],dp[j-money[i]]+money[i]); } printf("%.2lf\n",dp[sum]/100.0); } return 0; }
标签:
原文地址:http://www.cnblogs.com/wangdongkai/p/5376625.html