有点坑,题意说的是每张发票中单项物品额度不超过600,也就是说两个A的话需要加起来判断,说白了就是01背包只不过先判断一下输入数据的合法性,吧发票张数当体积,发票总额度当代价记好了,代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double q;
int n;
while(cin>>q>>n&&n){
double value[31],r[31]={0};
int tn;
tn=n;
for(int i=1,k=1;i<=tn;i++){
char a,b;
double v,va=0,vb=0,vc=0,count=0;
int num;
bool mark=true;
cin>>num;
for(int j=1;j<=num;j++){
cin>>a>>b>>v;
count+=v;
if(a=='A') va+=v;
if(a=='B') vb+=v;
if(a=='C') vc+=v;
if((a!='A'&&a!='B'&&a!='C')||vc>600||vb>600||va>600) mark=false;
}
if(!mark||count>1000) {n--;continue;}
else value[k++]=count;
}
for(int i=1;i<=n;i++)
for(int j=n;j>=0;j--)
if(r[j]<r[j-1]+value[i]) r[j]=r[j-1]+value[i];
double j=0;
for(int i=0;i<=n;i++) if(r[i]>j&&r[i]<=q) j=r[i];
printf("%.2lf\n",j);
}
return 0;
}