您的位置:首页 > 其它

HDOJ 1864 最大报销额[01背包]

2015-12-18 18:14 141 查看
题目链接: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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: