题意
你在说nm????
01背包dp就可以,注意当没有花费的01背包,只有价值的01背包 dp[j]=max(dp[j],dp[j-c[i]]+c[i]),对于浮点数*100,答案再处100
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int dp[3000000];
int c[111];
int main()
{
double v;
int n;
while(cin>>v>>n)
{
memset(dp,0,sizeof(dp));
int v1=int(v*100);
int cont=0;
if(!n) break;
for(int j=0;j<n;j++)
{
int k;
cin>>k;
double sum=0;
int fg=1;
double a1=0,b1=0,c1=0;
for(int i=0;i<k;i++)
{
char str;
double t1;
getchar();
scanf("%c:%lf",&str,&t1);
//printf("%lf\n",t1);
if(str=='A') a1+=t1;
else if(str=='B') b1+=t1;
else if(str=='C') c1+=t1;
else fg=0;
}
sum+=a1+b1+c1;
if(sum>1000||a1>600||b1>600||c1>600) fg=0;
if(!fg) continue;
else c[cont++]=int(sum*100);
}
for(int i=0;i<cont;i++)
{
for(int j=v1;j>=c[i];j--)
dp[j]=max(dp[j],dp[j-c[i]]+c[i]);
}
printf("%.2lf\n",dp[v1]*1.0/100);
}
return 0;
}