dp水题
选择出有效数据 然后就是01背包
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=3e6+7;
int T,n,flag,w,t;
double V,x,sum,a,b,c;
char ch;
int q[maxn],dp[maxn];
int main(){
while(~scanf("%lf%d",&V,&T),T!=0){
memset(q,0,sizeof(q));w=0;
memset(dp,0,sizeof(dp));
V=100*V;
while(T--){
scanf("%d",&n);
flag=0;sum=0;a=0;b=0;c=0;
while(n--){
scanf(" %c:%lf",&ch,&x);
sum+=x;
if(ch=='A')a+=x;
if(ch=='B')b+=x;
if(ch=='C')c+=x;
if(ch!='A'&&ch!='B'&&ch!='C') flag=1;
if(a>600||b>600||c>600) flag=1;
}
if(flag==1||sum>1000) continue;
else q[w++]=(int)(sum*100);
}
for(int i=0;i<w;i++){
for(int j=(int)V;j>=q[i];j--){
dp[j]=max(dp[j],dp[j-q[i]]+q[i]);
}
}
printf("%.2f\n",(1.0*dp[(int)V])/100);
}
}