题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864
题目是和01背包同样的问题;
现将数据处理一下,将能报销的单子统计出来
设dp[i]为加入第i张支票的话,可以报销的最大报销额
那么 record[i]=max{record(j)}+dp[i];0<=j<i;
给定一些物体的体积,给定一个背包体积;
使背包里的物体体积最大
代码:
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
//freopen("1010.txt","r",stdin);
double sum,dp[33],record[33];
double a,b,c,p,price,maxn,ans;
int n,t,number;
char temp,temp2;
bool flag;
while(scanf("%lf%d",&sum,&n)&&n){
memset(record, 0, sizeof(record));
number=0;
for(int i=0;i<n;i++){
scanf("%d",&t);
p=0;
flag=true;
a=b=c=0.0;
while(t--){
scanf(" %c%c%lf",&temp,&temp2,&price);
if(temp=='A'){
a+=price;
}
else if(temp=='B'){
b+=price;
}
else if(temp=='C'){
c+=price;
}
else{
flag=false;
}
}
if(flag && a<=600 && b<=600 && c<=600 && a+b+c<=1000){
dp[number++]=a+b+c;
}
}
ans=0.0;
for(int i=0;i<number;i++){
maxn=0.0;
for(int j=0;j<i;j++){
if(record[j]>maxn && (record[j]+dp[i]<=sum)){
maxn=record[j];
}
}
record[i]=maxn+dp[i];
if(record[i]>ans){
ans=record[i];
}
}
printf("%.2lf\n",ans);
}
return 0;
}