一道01背包题
题意:对于每张发票,有两种可能:报销,不报销,求最大报销额
只要先求出v[i],题将变得很简单
状态转移方程:dp[j]=max(dp[j],dp[j-1]+v[i]);
下面是我的ac代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
return a>b;
}
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,m;
int A,B,C;
int v[50],dp[50];
double V;
while(scanf("%lf%d",&V,&n) && n)
{
V*=100;
int cnt=0;
for(int i=0;i<n;i++)
{
int flag=0;
scanf("%d",&m);
A=B=C=0;
while(m--)
{
getchar();
char k;
double a;
scanf("%c:%lf",&k,&a);
if(k=='A')
A+=a*100;
else if(k=='B')
B+=a*100;
else if(k=='C')
C+=a*100;
else
flag=1;
}
if(flag || A>60000 || B>60000 ||C>60000 || A+B+C>100000 || A+B+C>V)//去掉不符合要求的
flag=1;
if(!flag)
v[cnt++]=A+B+C;
}
n=cnt;
memset(dp,0,sizeof(dp));
for( i=0;i<n;i++)
for(int j=n;j>0;j--)
dp[j]=max(dp[j],dp[j-1]+v[i]);
int mm=0;
for(i=1;i<=n;i++)
{
if(dp[i]>V)
continue;
mm=max(dp[i],mm);
}
printf("%.2f\n",mm/100.00);
}
return 0;
}