#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=5000005;
int f[maxn];
int num[50];
double q;
int t;
int main()
{
int i,j,n,m;
double x;
int ta,tb,tc,r;
char c;
while(scanf("%lf%d",&q,&n),n)
{
int k=0;
while(n--)
{
ta=0,tb=0,tc=0;
scanf("%d",&m);
int flag=0;
while(m--)
{
scanf(" %c:%lf",&c,&x);//这里前面有一个空格输入,要记得,还可以这样输入scanf("%*c%c:%lf",&c,&x);
x*=100;
r=(int)x;//转换成整型
if(flag==0)
{
if(c=='A'||c=='B'||c=='C')//保证 类型是在 A B C 三种类型中
{
if(c=='A')
{
if((ta+r)<=60000)//单项物品的价值不得超过600元
ta+=r;
else
flag=1;//如果有一项超过了的话,那么这张发票就没有用,不能报销
}
if(c=='B')
{
if((tb+r)<=60000)
{
tb+=r;
}
else
flag=1;
}
if(c=='C')
{
if((tc+r)<=60000)
{
tc+=r;
}
else
{
flag=1;
}
}
}
else
flag=1;//如果有一种类型不是这三种中一种的话,那么这张发票也是没有用的
}
}
if(flag==0&&(ta+tb+tc)<=100000)//还有就是要求每张发票的总额不得超过1000元,不然这张发票也是没有用
{
num[k++]=(ta+tb+tc);
}
}
q*=100;
t=(int)q;
memset(f,0,sizeof(f));
for(i=0; i<k; i++)//这里就是01背包
{
for(j=t; j>=num[i]; j--)
{
f[j]=max(f[j],f[j-num[i]]+num[i]);
}
}
printf("%.2lf\n",f[t]/100.0);//这里我范了一下混吧,就是直接写成100没有写成100.0
}
return 0;
}
HDU 1864 01背包
最新推荐文章于 2016-08-09 16:39:05 发布