又一个背包问题,对于每张发票,要么报销,要么不报销,0-1背包,张数即为背包;
转移方程:f[j]=max(f[j],f[j-1]+v[i]);
恶心地方:有这样的输入数据 3 A:100 A:200 A:300
#include<stdio.h> #include<string.h> int dp[7234567]; int main() { double sum,max; int check_num,n; double price[35],temp,t[3]; int IntMax; char c; int flag; int i,j,k; while(scanf("%lf%d",&max,&n)) { if(n==0) break; i=0; while(n--) { scanf("%d",&check_num); flag=1; sum=0; for(k=0;k<3;k++) t[k]=0; while(check_num--) { getchar(); scanf("%c:%lf",&c,&temp); sum+=temp; if(c!='A'&&c!='B'&&c!='C') { flag=0; continue; } t[c-'A']+=temp; if(temp>600||sum>1000||(c!='A'&&c!='B'&&c!='C')||t[c-'A']>600) { flag=0; } } if(flag==0) { continue; } price[i++]=sum; } k = i; IntMax = (int) ( max * 100 ); memset(dp,0,sizeof(dp)); for( i = 0; i < k; i++) { for( j = IntMax; j >= (int)(price[i] * 100); j--) { if( dp[j] < dp[j - (int)(price[i] * 100)] + (int)(price[i] * 100)) { dp[j] = dp[j - (int)(price[i] * 100)] + (int)(price[i] * 100); } } } printf("%.2lf/n",dp[IntMax] / 100.0); } return 0; }