http://acm.hdu.edu.cn/showproblem.php?pid=1864
200.00 3 2 A:23.50 B:100.00 1 C:650.00 3 A:59.99 A:120.00 X:10.00 1200.00 2 2 B:600.00 A:400.00 1 C:200.50 1200.50 3 2 B:600.00 A:400.00 1 C:200.50 1 A:100.00 100.00 0
123.50 1000.00 1200.50
然后背包容量为最大报销额,物品为满足条件的报销单数,物品价值==物品重量。然后注意浮点数不能做数组下标,因为题目数两位小数,故此乘以100化整。
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; int bill[105]; int dp[31*1000*100]; int main() { int n; double t; while(~scanf("%lf%d",&t,&n)) { if(n==0) break; int i,j,m,count=0; double temp[3],sum,tt; char ch; t=(int)(t*100); for(i=0;i<n;i++) { sum=0; scanf("%d",&m); temp[0]=temp[1]=temp[2]=0; bool flag=true; for(int j=0;j<m;j++) { getchar(); ch=getchar(); scanf(":%lf",&tt); if('A'==ch||'C'==ch||ch=='B') { temp[ch-'A']+=tt; sum+=tt; } else flag=false; } if(flag&&sum<=1000&&temp[0]<=600&&temp[1]<=600&&temp[2]<=600) bill[++count]=(int)(sum*100); } memset(dp,0,sizeof(dp)); for(int i=1;i<=count;i++) for(int j=(int)t;j>=bill[i];j--) if(j>=bill[i]) dp[j]=max(dp[j],dp[j-bill[i]]+bill[i]); /*for(int i=(int)t;i>=(int)t-10;i--) printf("(%d)\n",dp[i]);*/ printf("%.2lf\n",1.0*dp[(int)t]/100); } return 0; }