题意什么的呢!!是中文,自己看就懂得,就是小细节多了点,有点坑。
注意:
1、一张发票的总额不能超过1000,单个物品不能超过600,一种物品在发票上可以出现多次;
2、发票里面出现其他物品的,此发票就不能报销;
3、钱不是整数,还要注意一下输入的格式问题;
一个简单的01背包问题,细节不多说。转移方程:转移方程:dp[i]=max(dp[i],dp[j-1]+sum[i]);
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
double dp[40],sum[40];
int main()
{
int n,i,j,ans,t,ant;
double a,b,c;
double maxx,q,x;
char w;
while(~scanf("%lf%d",&q,&n) && n != 0)
{
ant=1;
memset(sum,0,sizeof(sum));
for(i=0; i<n; i++)
{
scanf("%d",&t);
a=b=c=0;
ans=1;
while(t--)
{
scanf(" %c:%lf",&w,&x);
if( w == 'A') a+=x;
else if(w == 'B') b+=x;
else if(w == 'C') c+=x;
else ans=0;
}
if(a > 600 || b >600 || c >600 || a+b+c >1000) ans=0;
if( ans == 1 )
{
sum[ant++]=a+b+c;
}
}
memset(dp,0,sizeof(dp));
for(i=1; i<ant; i++)
{
for(j=1; j<=i; j++)
{
if(dp[j-1]+sum[i] <= q) dp[i]=max(dp[i],dp[j-1]+sum[i]);
}
}
maxx=0;
for(i=1; i<ant; i++)
if(maxx < dp[i]) maxx = dp[i];
printf("%0.2lf\n",maxx);
}
return 0;
}
坚持.......