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就变成整数了. 代码例如以 ...
随机推荐
- 51nod1069【Nim取石子游戏】
具体看:萌新笔记之Nim取石子游戏可以这么写: #include <bits/stdc++.h> using namespace std; typedef long long LL; in ...
- vue路由守卫
路由守卫 //路由进来之时 beforeRouteEnter(to, from, next) { console.log(this, 'beforeRouteEnter'); // undefined ...
- Codevs 1688 求逆序对(权值线段树)
1688 求逆序对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给定一个序列a1,a2,…, ...
- ios 类似淘宝评论星星功能
创建星星视图: //星星 _myview = [[UIView alloc]initWithFrame:CGRectMake(95, 5, 200, 50)]; UIPanGestureRecogni ...
- NetCore + Mysql + EF:No coercion operator is defined between types 'System.Int16' and 'System.Boolean',
总结三种解决办法: 1.Mysql升级到7 2.Nuget安装Pomelo.EntityFrameworkCore.MySql 2.2.0替代MySql.Data.EntityFrameworkCor ...
- thinkphp5实现mysql数据库备份
其实备份数据库说白了就是向一个.sql的文档中写入一条一条的sql命令 public function back() { $to_file_name="backsql.sql"; ...
- redis之使用
redis之使用 redis ================================= 1.自动分配.你在什么时候用到了自动分配? 答:市场部或运营部招来的新的客户,单条(批量)录入数据的 ...
- F.Cards with Numbers
链接:https://ac.nowcoder.com/acm/contest/908/F 题意: AFei has many cards. Each card has a number written ...
- 手动配置 FreeBSD 网络
设置 IP 地址和网关 编辑 /etc/rc.conf $ sudo vim /etc/rc.conf # 设置ip地址和子网掩码 ifconfig_em0="inet 192.168.0. ...
- 学习flask的网址
学习flask的网址: http://www.bjhee.com