hdu1864最大报销额(01背包)
2024-10-17 23:17:24
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=187#problem/G
该题要注意的就是每张单子A种类的总和不能大与600,同样B,C类也一样,还有注意如果不是A,B,C类的不可以报销;
该题就是要把浮点型变成整数这样才能用01背包,这里就只要乘以100就可以了。
这题考的背包很简单,就是输入的金额为背包的容积,债券既是物体的体积又是物体的利润。就是处理输入的数据有点麻烦,这是我所不擅长的。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int dp[],w[];
int main()
{
int n,V,m,flag,tt;
double sum,price;
char c;
while(scanf("%lf%d",&sum,&n)!=EOF)
{
if(n==) break;
sum=sum*;
V=(int)sum;
tt=;
int t,ta=,tb=,tc=,x;
for(int i=;i<=n;i++)
{
sum=;
ta=,tb=,tc=;
scanf("%d",&m);
flag=;
while(m--)
{
scanf("%*c%c:%lf",&c,&price);
price=price*;
x=(int)price;
if(flag==)
{
if((c=='A')||(c=='B')||(c=='C'))
{
if(c=='A'&&ta+x<=)
{
ta=ta+x;
}
else if(c=='B'&&tb+x<=)
{
tb=tb+x;
}
else if(c=='C'&&tc+x<=)
{
tc=tc+x;
}
else flag=;
}
else flag=;
}
}
t=ta+tb+tc;
if(flag==&&t<=)
{
w[tt++]=t;
}
}
memset(dp,,sizeof(dp));
for(int i=;i<tt;i++)
{
for(int j=V;j>=w[i];j--)
{
if(dp[j-w[i]]+w[i]>dp[j])
dp[j]=dp[j-w[i]]+w[i];
}
}
double money=dp[V]/100.0;
printf("%.2lf\n",money);
}
return ;
}
最新文章
- ionic 获取手机所在位置
- 【Android自学日记】五大布局常用属性
- 从零开始学习Android(一)Android环境的搭建
- NLPIR分词工具的使用(java环境下)
- 笔记8:winfrom连接数据库DBHelp
- BZOJ 3165 Segment
- js防止回车(enter)键提交表单及javascript中event.keycode
- extjs folder is lost解决方法 和 FineUI主题切换时 iframe内的内容主题不变的解决方法
- Vijos 1004 伊甸园日历游戏 博弈
- 解决eclipse使用tomcat启动项目后访问项目404的问题
- 计算kdj
- mysql 开发进阶篇系列 21 磁盘I/O问题(RAID)
- 巧用NULL模式解耦依赖
- error occurred at recursive SQL level 1
- solrj索引操作
- PyQt4显示提示信息
- HTML5之pushstate、popstate操作history,无刷新改变当前url
- nvm npm node.js的关系
- pthread到Win32thread
- gulp快速将css中的px替换成rem