简单0-1背包注意题目条件单项的最大额度和单张发票的最大额度
输入有3A 300,A 300,A 300的情况
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
using namespace std;
int main(){
double v,t;
int i,j;
while(cin>>v>>t){
double nodes[50],q;
double dp[50];
int len=0;
double A,B,C;
char ch;
if(t==0) break;
for(i=1;i<=t;i++)
{
int flag=1;
A=0;B=0;C=0;
int n;
scanf("%d",&n);
for(j=0;j<n;j++)
{
scanf(" %c:%lf",&ch,&q);
if((ch!='A' && ch!='B' && ch!='C' )|| q>600) //由题意得
{
flag=0;
break;
}
if(ch=='A') A+=q;
else if(ch=='B') B+=q;
else if(ch=='C') C+=q;
}
if(flag && A+B+C<=1000 && A<=600 && B<=600 &&C<=600) //单物品:两个A 算一个。。
nodes[len++]=A+B+C;
}
for(int i=0;i<35;i++)dp[i]=-1;
dp[0]=0;
for(int i=0;i<len;i++){
for(int j=len;j>0;j--){
if(dp[j-1]!=-1&&double(dp[j-1]+nodes[i])<=v)
dp[j]=max(double(dp[j]),double(dp[j-1]+nodes[i]));
}
}
double ans=0;
for(int i=0;i<35;i++){
if(dp[i]<=v&&dp[i]>ans)
ans=dp[i];
}
printf("%.2lf\n",ans);
}
}