题意:
给出最大报销金额,以及几个发票,发票的单张钱数必须少于1000,且A,B,C单张不能高于600.如果有其他D,E等 这张发票不能报销
思路:
先把可以报销的发票提取出来,然后裸背包
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int dp[3000005];
int price[35];
int val[35];
int main()
{
double sum;
int t;
while(~scanf("%lf%d",&sum,&t))
{
int cnt=0;
int n=sum*100;
if(t==0) break;
while(t--)
{
int m;
scanf("%d",&m);
int res=0,a=0,b=0,c=0;
while(m--)
{
char s;
double mon=0;
scanf(" %c:%lf",&s,&mon);
if(s=='A')
{
res+=mon*100;
a+=mon*100;
}
else if(s=='B')
{
res+=mon*100;
b+=mon*100;
}
else if(s=='C')
{
res+=mon*100;
c+=mon*100;
}
else res=1000000;
}
if(res<=100000&&a<=60000&&b<=60000&&c<=60000)
{
price[++cnt]=res;
}
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=cnt;i++)
{
for(int j=n;j>=price[i];j--)
{
dp[j]=max(dp[j],dp[j-price[i]]+price[i]);
}
}
double ans=dp[n]*1.0/100;
printf("%.2lf\n",ans);
}
}