这道题有两个需要注意的地方:一是题目说的“每项”其实是“每类”,也就是A类,B类和C类,而不是每个物品......(这题目表述有问题啊!);二是在计算时要将所有的数据扩大100倍然后再转为int,计算出最后结果后再缩小为原来的倍率,否则无法用钱数来做背包(浮点数无法作为数组下标)。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
double dp[3000005];
int m[35];
int main()
{
double q;int n;
while(cin>>q>>n)
{
if(n==0) break;
q*=100;
int qtmp=(int)q;
memset(dp,0,sizeof(dp));memset(m,0,sizeof(m));
bool flag;int idx=0;
for(int i=0;i<n;i++)
{
double sum=0;
char ch;double a,b,c,tmp;
int num;
flag=1;
cin>>num;getchar();
a=b=c=0;
while(num--)
{
tmp=0;
scanf("%c:%lf",&ch,&tmp);char c=getchar();
tmp*=100;
if(ch=='A')
a+=tmp;
else if(ch=='B')
b+=tmp;
else if(ch=='C')
c+=tmp;
else
flag=0;
if(flag)
sum+=tmp;
}
if(sum>100000||a>60000||b>60000||c>60000)
flag=0;
if(flag)
m[idx++]=(int)sum;
}
for(int i=0;i<=idx;i++)
for(int j=qtmp;j>=m[i];j--)
dp[j]=max(dp[j],dp[j-m[i]]+m[i]);
printf("%.2lf\n",dp[qtmp]/100.0);
}
return 0;
}