HDU 1864 最大报销额(01背包,烂题)
题意:被坑惨,单项不能超过600,其实是一张发票上A类/B类/C类的总和分别不能超过600。
思路:此题的数据很烂。用贪心也能过,用01背包也可以。都测试不出到底那些是错的。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int N=; //发票张数
double money;
int num,t;
int A,B,C;
double tick[N]; int cmp(double a, double b)
{
return a>b?:;
}
void packet()
{
double ans=;
sort(tick, tick+t, cmp);
for(int i=; i<=t; i++)
{
if(money>=tick[i])
{
ans+=tick[i];
money-=tick[i];
} }
printf("%.2lf\n",ans); } int main()
{
freopen("input.txt","r",stdin); int n,flag,u;
double cnt=, pri; //只是用于计算每张发票总和
char c,tmp; while(cin>>money>>num&&num)
{
t=;
memset(tick, , sizeof(tick)); for(int i=; i<num; i++) //发票
{
flag=;cnt=;A=B=C=; cin>>n;
for(int j=; j<n; j++) //发票项
{
cin>>c>>tmp>>pri;
cnt+=pri; if(c=='A')
A+=pri;
else if(c=='B')
B+=pri;
else if(c=='C')
C+=pri;
else
flag=;
}
if( !flag || cnt> || A> || B> || C> )
continue;
else
tick[t++]=cnt; }
//以上都是输入的,重点在这个函数而已
packet();
}
return ;
}
贪心
我觉得贪心应该不能过的,比如有数据:
1001.5 4
1 A:500
1 C:400
1 A:300
1 B:200
贪心的结果是900,而正确答案是1000=500+300+200.。神奇的是AC了。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
const int N=; //发票张数
double money;
double dp[];
double tick[N];
int num,t,A,B,C; void packet()
{
for(int i=; i<t; i++)
{
for(int j=ceil(money); ((double)j)-tick[i]>=money-floor(money); j--)//直接用向上取整来决定背包容量
{
double tmp = j-tick[i]; //还能放的容量
if( dp[int(ceil(tmp))] <= tmp && dp[int(ceil(tmp) )] + tick[i] <= money )
tmp = dp[int(ceil(tmp) )] + tick[i];
else
tmp = dp[int(tmp)] + tick[i]; dp[j]= max( tmp , dp[j] );
}
}
printf("%.2lf\n",dp[(int)ceil(money)]);
} int main()
{
freopen("input.txt","r",stdin);
int n,flag,u;
double cnt=, pri; //只是用于计算每张发票总和
char c,tmp; while(cin>>money>>num&&num)
{
t=;
memset(tick, , sizeof(tick));
memset(dp, , sizeof(dp)); for(int i=; i<num; i++) //发票
{
flag=;cnt=;A=B=C=;
cin>>n;
for(int j=; j<n; j++) //发票项
{
cin>>c>>tmp>>pri;
cnt+=pri;
if(c=='A')
A+=pri;
else if(c=='B')
B+=pri;
else if(c=='C')
C+=pri;
else
flag=;
}
if( !flag || cnt> || A> || B> || C> )
continue;
else
tick[t++]=cnt;
}
packet();
}
return ;
}
限额作为背包容量
这个比上面的精确多了,至少上面的数据能测出正确答案。
HDU 1864 最大报销额(01背包,烂题)的更多相关文章
- HDU 1864 最大报销额 0-1背包
HDU 1864 最大报销额 0-1背包 题意 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上, ...
- HDU -1864最大报销额(01背包)
这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧 1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销 2. 物品单项的报销额不超过 ...
- hdu 1864 最大报销额 01背包
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- HDOJ 1864 最大报销额(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=1864 最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memor ...
- HDU 1864最大报销额 01背包问题
B - 最大报销额 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- HDU - 1864 最大报销额 (背包)
题意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编 ...
- 杭店 ACM 1864 最大报销额 01背包
![勾选C++才能过 题意: 先规定可以报销一定额度的发票,物品类型有A,B,C,三种.要求每张发票总额不得超过1000元,单项物品不得超过600.求报销的最大额 分析: 先找到合格的发票,然后再挑选 ...
- hdu 1864 最大报销额(背包)
最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 1864最大报销额(一维背包)
题目地址:HDU 1864 刚上来看着挺麻烦的..细致看了看原来好简单好简单...仅仅要去掉一些不符合要求的发票,剩下的就是最简单的背包问题了..对于小数问题,仅仅要*100就变成整数了. 代码例如以 ...
随机推荐
- 鼠标右键添加cmd
给鼠标右键添加 cmd https://jingyan.baidu.com/article/3f16e003c408142591c103b2.html 有一些软件,最好不要装到Program File ...
- “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构、登录窗口、以及主界面)
一.在上一篇文章中,主要说的就是把主框架搭建起来,并且Nhibernate能达到增删改查的地步.测试好之后再来看这篇文章,我的主框架相对来说简答一点,重点还是实现系统的功能,以及对Jquery-Eas ...
- Fiddler如何抓取HTTPS协议的网页
Fiddler默认只能抓取HTTP协议的网页,不能抓取HTTPS协议的网页,而我们很多时候,都需要抓HTTPS协议的网页,比如抓淘宝数据等.今天,韦玮老师会为大家讲解如何使用Fiddler抓取HTTP ...
- hdu1175 连连看
连连看 HDU - 1175 “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子 ...
- 阿里云服务器新手安装nginx
1.域名购买之后 备案. 2.购买服务器. 3.这两个条件具备之后进行下一步. 本人使用Mac ,实践流程按照Mac本的流程操作. 作为初学者,简配的服务器, 实例类型: I/O优化,操作系统: Ce ...
- 目前最全的浏览器/CSS选择器兼容性总结(2009-8-10更新)
2009年2月24日,Safari 4.0 beta版正式发布,Safari从它的3.2版本开始就已经支持所有的CSS选择器(包括最新的CSS3).不过为了方便大家的工作,下面提供了最新版本的CSS选 ...
- require--按需加载js与模块化
1.html中: “<script type="text/javascript" src="js/require.js" data-main=" ...
- GYM 101933D(最短路、二分、dp)
要点 非要先来后到暗示多源最短路,求最小的最大值暗示二分 二分内部的check是关键,dp处理一下,\(dp[i]\)表示第\(i\)笔订单最早何时送达,如果在ddl之前到不了则\(return\ 0 ...
- A Simple Math Problem (矩阵快速幂)
Lele now is thinking about a simple function f(x). If x < 10 f(x) = x. If x >= 10 f(x) = a0 ...
- Kali下安装rar
1.在kali中安装rar解压软件 方法一: apt-get install rar 方法二: 下载RAR:wget https://www.rarlab.com/rar/rarlinux-x64-5 ...