#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揹包
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.