这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧

1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销

2. 物品单项的报销额不超过600

3. 每个发票总额不超过1000

有了这三个,还有一个要小心的就是报销额可以为浮点数,所以这里有个小技巧,就是将它乘100,到最后再除以100, 为什么要乘100呢, 因为最后要求保留两位小数

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int dp[];//发票张数30*每张总额1000*放大倍数100 = 3000000
int main()
{
char ch;
double x, y;
int sum, a, b, c, money[], t;
int n, k;
while (~scanf("%lf %d", &x, &n) && n)
{
sum = (int)(x * );//将背包的容量放大为整数(这里就是报销的最大值)
memset(dp, , sizeof(dp));
memset(money, , sizeof(money));
int len = ;//可报销的列表长度,也就是最后的n
for (int i = ; i < n; i++)
{
scanf("%d", &k);
a = b = c = ;//分别来保存a类型,b类型,c类型
bool flag = true;
while (k--)
{
scanf(" %c:%lf", &ch, &y);
t = (int)(y * );
if (ch == 'A' && a + t <= )
a += t;
else if (ch == 'B' && b + t <= )
b += t;
else if (ch == 'C' && c + t <= )
b += t;
else
flag = false; }
if (a + b + c <= && a <= && b <= && c <= && flag)
money[len++] = a + b + c;//如果满足以上三个条件
}
for (int i = ; i < len; i++)//01背包核心代码
{
for (int j = sum; j >= money[i]; j--)
if (dp[j] < dp[j - money[i]] + money[i])
dp[j] = dp[j - money[i]] + money[i];
}
printf("%.2f\n", (dp[sum]/100.0));
}
return ;
}

HDU -1864最大报销额(01背包)的更多相关文章

  1. HDU 1864 最大报销额 0-1背包

    HDU 1864 最大报销额 0-1背包 题意 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上, ...

  2. hdu 1864 最大报销额 01背包

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  3. HDU 1864 最大报销额(01背包,烂题)

    题意:被坑惨,单项不能超过600,其实是一张发票上A类/B类/C类的总和分别不能超过600. 思路:此题的数据很烂.用贪心也能过,用01背包也可以.都测试不出到底那些是错的. #include < ...

  4. HDOJ 1864 最大报销额(01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1864 最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memor ...

  5. HDU 1864最大报销额 01背包问题

    B - 最大报销额 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  6. HDU - 1864 最大报销额 (背包)

    题意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编 ...

  7. 杭店 ACM 1864 最大报销额 01背包

    ![勾选C++才能过 题意: 先规定可以报销一定额度的发票,物品类型有A,B,C,三种.要求每张发票总额不得超过1000元,单项物品不得超过600.求报销的最大额 分析: 先找到合格的发票,然后再挑选 ...

  8. hdu 1864 最大报销额(背包)

    最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. HDU 1864最大报销额(一维背包)

    题目地址:HDU 1864 刚上来看着挺麻烦的..细致看了看原来好简单好简单...仅仅要去掉一些不符合要求的发票,剩下的就是最简单的背包问题了..对于小数问题,仅仅要*100就变成整数了. 代码例如以 ...

随机推荐

  1. Hibernate4 clob字段存取

    domain的字段: private Clob content; hibernate的xml映射 <property name="content" type="cl ...

  2. 面向对象设计模式之TemplateMethod模板方法(行为型)

    动机:在软件构建过程中,对于某一项任务,他常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现:如何在确定稳定操作结构 ...

  3. php 随机显示据今天30天内的任意一天

    function randomDate() { //echo date( "Y-m-d H:m:s", $newtime); //echo date("Y-m-d H:m ...

  4. Kafka 集群消息监控系统:Kafka Eagle

    Kafka Eagle 1.概述 在开发工作当中,消费 Kafka 集群中的消息时,数据的变动是我们所关心的,当业务并不复杂的前提下,我们可以使用 Kafka 提供的命令工具,配合 Zookeeper ...

  5. PYTHON WEATHER

    小玩一下python强大的库文件,调api获取天气情况 #coding:utf-8 import urllib import json content = urllib.urlopen('http:/ ...

  6. PS5穿越云层3D文字

    妈的,搜狗浏览器有时候会出问题,保存的内容找不到了…… 视图--显示参考线或者“显示额外内容”会取消或者加上参考线,后者功能更强一些,ctrl+D有时可以代替后者的功能,后者可以去掉蒙版的参考线,前者 ...

  7. Spring中使用log4j随笔

    web.xml中的配置: <!--由Sprng载入的log4j配置文件位置--> <context-param> <param-name>log4jConfigLo ...

  8. Keil C51中变量的使用

    引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用 ...

  9. VC++大数据量绘图时无闪烁刷屏技术实现(我的理解是,在内存上作画,然后手动显示,而不再直接需要经过WM_PAINT来处理了)

    http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序 ...

  10. Sql语句中IN等方面的用法

    select * from txt1 select * from txt2 select * from txt1 where name in (select name from txt2 where ...