hdu 最大报销额(01背包)

 

http://acm.hdu.edu.cn/showproblem.php?pid=1864

 

解题思路:将报销上限设为背包容量,可报销的发票的金额扩大100倍作为价值做01背包问题求解。

 

#include <stdio.h> #include <string.h> #define max(a,b) a>b?a:b int dp[3000010]; int main() { int N,i,j,m,flag,len; double Q,val; int w[35]; int ww[3]; char ch; while (scanf("%lf%d",&Q,&N)!=EOF&&N) { memset(dp,0,sizeof(dp)); len = 0; for (i=0;i<N;i++) { scanf("%d%*c",&m); flag = 1; for(j=0;j<3;j++) ww[j] = 0; j = 0; while (m--) { scanf("%c:%lf%*c",&ch,&val); if(ch>='A'&&ch<='C') { j = ch-'A'; ww[j]+=(int)(val*100);/*强转为整型,小数变整数*/ } /*不可报销条件*/ if(ww[j]>60000||ww[0]+ww[1]+ww[2]>100000||ch!='A'&&ch!='B'&&ch!='C') flag = 0; } if (flag) w[len++] = ww[0]+ww[1]+ww[2]; } for (i=0;i<len;i++) { for (j=(int)(Q*100);j>=w[i];j--) dp[j] = max(dp[j],dp[j-w[i]]+w[i]); } printf("%.2lf/n",(double)(dp[(int)(Q*100)]/100.0)); } return 0; }

你可能感兴趣的:(hdu 最大报销额(01背包))