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就变成整数了. 代码例如以 ...
随机推荐
- [hiho1578]Visiting Peking University
题意:签到题,不叙述了 解题关键:模拟即可. #include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; typ ...
- 【机器学习】随机森林RF
随机森林(RF, RandomForest)包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定.通过自助法(boot-strap)重采样技术,不断生成训练样本和测试样本,由训练样本 ...
- java之异常处理、异常分类、Throwable、自定义异常
参考http://how2j.cn/k/exception/exception-trycatch/336.html 异常处理 try catch 1.将可能抛出FileNotFoundExceptio ...
- Myeclipse如何使用自带git工具向远程仓库提交代码(转)
Myeclipse如何使用自带git工具向远程仓库提交代码 第一步:将改动的代码标记 项目右键:team->synchronize workspace 点击确定 项目右键>add to g ...
- 【转】oracle的分析函数over
源地址:http://www.cnblogs.com/sumsen/archive/2012/05/30/2525800.html
- PJzhang:一站式跨境卖家网址导航Amz520.com
猫宁!!! 参考链接:http://www.guxiaobei.com/amz520-release.html www.amz520.com是一个跨境电商导航站点,汇集了大量的高效信息,做这个站点花费 ...
- HE学业水平考试游记 By cellur925
\(I'm\) \(back\). Day -2 今天高二全体学生开始了愉悦的长达两天半的自习2333. 第一天刚了最不会的地理必修一.以前没发现,其实真的挺有趣的233. 于是用了一天学习了一年的地 ...
- day7计算作业详解
1.day7题目 1.判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方的和还等于这个数. 那这个数就是一个水仙花数, 例如: 153 = 13 + 53 + 3**3 2.给 ...
- Python-14-抽象及关键字参数
可使用内置函数callable判断某个对象是否可调用 >>> import math >>> x = 1 >>> y = math.sqrt &g ...
- ubuntu 设置字符集 locale(解决乱码问题)
1.locale 查看现在的locale配置环境 2.localepurge 配置需要的locale(如果没有这个命令,用apt-get install localepurge安装) 3.locale ...