HDU 1864 最大报销额 0-1背包
HDU 1864 最大报销额 0-1背包
题意
现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。
这里要注意的是,只要总金额大于1000,或者每种类别的总金额大于600,或者这个发票中有其他类别物品,就不能报销
解题思路
这里就是简单的\(0-1\)背包了,主要的就是在于对于数据的预处理方面。
还有一点就是数组下标需要整数,但是这个金额都是浮点数,该怎么办呢?我们发现,这里输入的数据都是保留了小数点后两位,所以我们可以对每个金额\(*100\),这样的话就都是整数了。
一些细节参见代码实现。
代码实现
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=40;
const int maxm=4e5+7;
const int maxq=1000*30*100+7;
double rec[maxn];
double dp[maxq];
double q;
int n, m;
int main()
{
while(scanf("%lf%d", &q, &n) && n!=0)
{
char type;
int flag, cnt=0; //使用cnt来记录实际合法的发票个数
while(n--)
{
double price, va=0, vb=0, vc=0;//总金额,A,B,C类的总金额
flag=1; //一个标记
scanf("%d", &m);
while(m--)
{
scanf(" %c:%lf", &type, &price);
if(flag==0)//如果标记为0的话,说明前面有不合法的数据,这个发票也就作废了
continue;
if(type=='A')
va+=price;
else if(type=='B')
vb+=price;
else if(type=='C')
vc+=price;
else flag=0;
}
//下面会再次进行判断
if(flag==1 && va<=600.0 && vb<=600.0 && vc<=600.0 && (va+vb+vc)<=1000.0)
{
rec[++cnt]=va+vb+vc;
}
}
memset(dp, 0, sizeof(dp));
int max_val=int(q*100);//最大金额化成整数
for(int i=1; i<=cnt; i++)
{
for(int j=max_val; j>=int(rec[i]*100); j--) //每张发票的金额也要化成整数
{
dp[j]=max(dp[j-int(rec[i]*100)]+rec[i], dp[j]);
}
}
printf("%.2lf\n", dp[max_val]);//注意输出格式,要求小数点后两位。
}
return 0;
}
HDU 1864 最大报销额 0-1背包的更多相关文章
- hdu 1864 最大报销额【01背包】
题目链接:https://vjudge.net/problem/HDU-1864 题目大意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求 ...
- hdu 1864 最大报销额(01背包)
最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU - 1864 最大报销额 (01背包)
题意:现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编写 ...
- HDOJ(HDU).1864 最大报销额 (贪心)
HDOJ(HDU).1864 最大报销额 题意分析 题目有点问题,原题中说的 单项物品的价值不得超过600元 应该是单类物品的价值不能超过600元. 一开始以为是01背包,后来按贪心写过了. 一张一张 ...
- HDU -1864最大报销额(01背包)
这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧 1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销 2. 物品单项的报销额不超过 ...
- hdu 1864 最大报销额(背包)
最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 1864最大报销额(一维背包)
题目地址:HDU 1864 刚上来看着挺麻烦的..细致看了看原来好简单好简单...仅仅要去掉一些不符合要求的发票,剩下的就是最简单的背包问题了..对于小数问题,仅仅要*100就变成整数了. 代码例如以 ...
- hdu 1864 最大报销额 01背包
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- HDU - 1864 最大报销额 (背包)
题意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编 ...
随机推荐
- C++常用速查
int main() { int arr[2][5] = { {1,8,12,20,25}, {5,9,13,24,26} }; } void f(double p[][10]) { } #inclu ...
- php实现hashTable
Hash表作为最重要的数据结构之一,也叫做散列表.使用PHP实现Hash表的功能.PHP可以模拟实现Hash表的增删改查.通过对key的映射到数组中的一个位置来访问.映射函数叫做Hash函数,存放记录 ...
- 常用深度学习框架(keras,pytorch.cntk,theano)conda 安装--未整理
版本查询 cpu tensorflow conda env list source activate tensorflow python import tensorflow as tf 和 tf.__ ...
- 使用Swagger自动生成文档
1.maven依赖 maven仓库(https://mvnrepository.com/)搜索springfox <!-- https://mvnrepository.com/artifact/ ...
- AJAX 实例解析
AJAX 实例 为了帮助您理解 AJAX 的工作原理,我们创建了一个小型的 AJAX 应用程序: 实例 AJAX 不是新的编程语言,而是一种使用现有标准的新方法.深圳dd马达 AJAX 是与服务器交换 ...
- Spring Boot教程(二十)开发Web应用(1)
静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /s ...
- 解决vuex保存的数据刷新页面时清空
参考文章: vuex中store保存的数据,刷新页面会清空 主要解决代码: 1.更改store文件下index文件state的定义 const store = new Vuex.Store({ sta ...
- oracle11g安装补丁升级
检查当前数据库CPU和PSU补丁信息 方法一: 登录数据库,检查DBA_REGISTRY_HIST视图. SYS@orcl> select *from dba_registry_history; ...
- 【Python】学习笔记十四:循环进阶
range() 在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标. 我们继续开发range的功能,以实现下标对循环的控制: s = 'abcdefghj' ...
- SQL server 从创建数据库到查询数据的简单操作
目录. 创建数据库 创建表 插入数据 查询 1.创建数据库 --创建数据库 create database db_Product go --使用数据库use db_Productgo 2.创建表 -- ...