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;
}
题目是和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;
}
相关文章推荐
- POJ&nbsp;3301&nbsp;Texas&nbsp;Trip[三分]
- ZOJ&nbsp;2614&nbsp;Bridge[三分求解]
- HDOJ&nbsp;1249&nbsp;三角形『平面分隔』
- HDOJ&nbsp;&nbsp;2516&nbsp;&nbsp;取石子游戏
- HODJ&nbsp;4111&nbsp;Alice&nbsp;and&nbsp;Bob(博弈)
- strstr函数[字符串处理]
- POJ&nbsp;2774&nbsp;Long&nbsp;Lon…
- POJ&nbsp;1743&nbsp;Musical&nbsp;Theme[后缀数组]
- POJ&nbsp;3261&nbsp;Milk&nbsp;Patterns[后缀数组]
- HDOJ&nbsp;1316&nbsp;How&nbsp;Many&nbsp;Fibs?
- 【郑轻oj】1851-KILL(三国杀,水)(好玩!)
- Android布局之ListView初步介绍
- [Android UI研究] 学习笔记
- 20151218
- java提高篇(十七)-----异常(二)
- HDOJ&nbsp;1316&nbsp;2^x&nbsp;mod&nbsp;n&nbsp;=&nbsp;1
- 快速幂取模运算
- POJ&nbsp;2406&nbsp;Power&nbsp;St…
- 【转载】C语言中scanf格式化输入函…
- HDOJ&nbsp;1242&nbsp;&nbsp;&nbsp;Rescue