您的位置:首页 > 其它

hdu 最大报销额(01背包)

2010-08-10 19:17 183 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: