/*
HDOJ 1864 求最大报销额
还是和01背包问题是一个类型的。
设dp[i]为加入第i张支票的话,可以报销的最大报销额
那么 dp[i]=max{dp(j)}+zhipiao[i];0<=j<i
*/
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n,i,j,m,flag,id;
double Q,zhipiao[31],dp[31],ans,maxn,a,b,c,p;
char ch1,ch2;
while(cin>>Q>>n)
{
if(n == 0)
break;
id=0;
for(i=0;i<n;i++)
{
cin>>m;
a=b=c=0.0;
flag=1;
for(j=0;j<m;j++)
{
cin>>ch1>>ch2>>p;
if(ch1 == 'A')
a += p;
else if(ch1 == 'B')
b+= p;
else if(ch1 == 'C')
c+= p;
else
flag=0;
}
if(a>600 || b>600 || c>600 || a+b+c>1000)
flag=0;
if(flag != 0)
zhipiao[id++]=a+b+c;
}
memset(dp,0.0,sizeof(dp));
ans=0.0;
for(i=0;i<id;i++)
{
maxn=0.0;
for(j=0;j<i;j++)
{
if( (dp[j]>maxn) && (dp[j]+zhipiao[i] <= Q) )
maxn=dp[j];
}
dp[i]=maxn+zhipiao[i];
if(dp[i] > ans)
ans=dp[i];
}
cout<<setiosflags(ios::fixed);
cout<<setprecision(2)<<ans<<endl;
}
return 0;
}
01背包——HDOJ 1864
最新推荐文章于 2019-02-21 13:39:32 发布