Proud Merchants HDU - 3466 01背包&&贪心
最近,我去了一个古老的国家。在很长一段时间里,它是世界上最富有、最强大的王国。结果,这个国家的人民仍然非常自豪,即使他们的国家不再那么富有。商人是最典型的,他们每个人只卖一件商品,价格是Pi,但是如果你的钱少于Qi,他们就会拒绝和你交易,而我评估每件商品的价值Vi。如果他有M单位的钱,iSea能得到的最大值是多少?
输入
在输入中有几个测试用例。每个测试用例以两个整数N M(1≤N≤500,1≤M≤5000)开始,表示项目编号和初始资金。接着N行,每一行包含3个数字Pi, Qi和Vi(1≤Pi≤Qi≤100,1≤Vi≤1000),它们的含义在描述中。输入在文件标记结束时终止。
输出
对于每个测试用例,输出一个整数,表示iSea可以获得的最大值。
Sample Input
2 10
10 15 10
5 10 5
3 10
5 10 5
3 5 6
2 7 3
Sample Output
5
11
题解:
这道题和01背包有什么不同呢?
给你两个物品:(现在你手里有钱17)
一、物品价值P1=5 ,物品Q1=12
二、物品价值P2=10 ,物品Q2=10
如果你第一次买第一个物品,那么你还可以买第二个物品
但是如果你第一次买第二个物品,你就买不了第一个物品了。
所以这就涉及到了物品买的顺序的问题了
正常01背包dp方程dp[j]=max(dp[j],dp[j-Pi])
那么也就是说dp[j]中存放的最优解是从dp[j]或者dp[j-Pi]中获得的(因为我得01背包用的滚动数组压缩内存,所以dp[j]也可以是从上一级dp循环中的最优解)
重要的是dp[j-Pi]
dp[j]代表什么意思?就是你有空间为j的时候你能获得的最大价值
那么因为dp[j]的一个状态是从dp[j-Pi]转移过来的,所以也就是说j-Pi这一部分空间已经被使用完了
那么我们要保证这个物品可以买,就只有当m-(j-Pi)>=Qi条件满足的时候才有资格买这个物品 (m在这代表你拥有的钱的总数,初始资金)
可能大家有点疑惑,在01背包的第二层for循环中就是枚举钱为j时候能获取的最大价值,那么为什么还要用到m-j这一部分钱来判断呢?
因为最后我们要的结果就是在初始资金为m的时候能获取最大价值,所以中间的dp状态如果能买这个物品那就买(大家还是自己想想吧)
又因为j>=Pi且m-(j-Pi)>=Qi
得到:Pi<=j<=m-(Qi-Pi)
又因为我们要保证无后效性,即前面的在更新时对后面的决策无影响。那么后面的d[j-p[i]]这个状态肯定在前面已经更新到了。所以就是说前面的更新的范围应该比后面大。
所以就是P1 - Q1 > P2-Q2;即按照P-Q从大到小排序,或者Q - P按照从小到大排序才能保证后面的能更新到不丢失状态。
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 using namespace std;
5 int max(int x,int y)
6 {
7 if(x>y) return x;
8 else return y;
9 }
10 struct goods
11 {
12 int money,lesses,value;
13 }m[1005];
14 bool mmp(goods x,goods y)
15 {
16 return (x.lesses-x.money)<(y.lesses-y.money);
17 }
18 int v[5005];
19 int main()
20 {
21 int a,s,d,f,g;
22 while(~scanf("%d%d",&a,&s))
23 {
24 memset(v,0,sizeof(v));
25 for(d=1;d<=a;++d)
26 scanf("%d%d%d",&m[d].money,&m[d].lesses,&m[d].value);
27 sort(m+1,m+a+1,mmp);
28 for(d=1;d<=a;++d)
29 {
30 for(f=s;f>=m[d].lesses;--f) //注意这里不是money,因为有lesses的限制
31 {
32 v[f]=max(v[f],v[f-m[d].money]+m[d].value);
33 }
34 }
35 printf("%d\n",v[s]);
36 }
37 return 0;
38 }
Proud Merchants HDU - 3466 01背包&&贪心的更多相关文章
- Proud Merchants HDU - 3466 (思路题--有排序的01背包)
Recently, iSea went to an ancient country. For such a long time, it was the most wealthy and powerfu ...
- 3466 ACM Proud Merchants 变形的01背包
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3466 题意:假设你有M元,已经Pi,Qi,Vi(i为角标,1<i<N),当M>Qi,时才 ...
- Re0:DP学习之路 Proud Merchants HDU - 3466
解法 排序+01背包 这里的排序规则用q-p升序排列这里是一个感觉是一个贪心的策略,为什么这样做目前也无法有效的证明或者说出来 然后就是01背包加了一个体积必须大于什么值可以装那么加一个max(p,q ...
- HDU 3466 01背包变形
给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...
- hdu 3466 Proud Merchants 【限制性01背包】+【贪心】
题目链接:https://vjudge.net/contest/103424#problem/J 转载于:https://www.bbsmax.com/A/RnJW16GRdq/ 题目大意: 有n个商 ...
- HDU 3466(01背包变种
http://acm.hdu.edu.cn/showproblem.php?pid=3466 http://www.cnblogs.com/andre0506/archive/2012/09/20/2 ...
- hdu 3466 01背包变形【背包dp】
http://acm.hdu.edu.cn/showproblem.php?pid=3466 有两个物品P,Q,V分别为 3 5 6, 5 10 5,如果先dp第一个再dp第二个,背包容量至少要为3+ ...
- hdu 1203 01背包 I need a offer
hdu 1203 01背包 I need a offer 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:给你每个学校得到offe ...
- Proud Merchants(POJ 3466 01背包+排序)
Proud Merchants Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) ...
随机推荐
- kubernets之namespace
一 命名空间的介绍以及作用 1 概念 为了方便不同部门之间对kubernets集群的使用,并且对其进行有效的隔离,kubernets提供了一种资源隔离手段,通过将各种不同资源分组到 一个区域,并且统 ...
- AWD生存之道
比赛开始阶段 常见漏洞的防御手段:https://www.freebuf.com/articles/web/208778.html 一.登陆SSH 重点 如果ssh的密码不是随机密码,记得一开始就进行 ...
- postgresql插件安装
postgresql安装包自带插件安装: 1.编译安装插件 # root用户 # postgresql安装过程省略 # 进入解压包的contrib目录 cd postgresql-10.6/contr ...
- web dynpro配置注意事项
如果你想使用web dynpro 开发的应用,但是发现浏览器报错,那么你按照下面的步骤逐一进行检查吧.特别是返回的500错误,或者是你发现浏览器的地址栏中以http://<hostname> ...
- [Usaco2016 Dec]Moocast
原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4749 可以对于每个点\(i\),往跟\(i\)距离小于等于\(p[i]\)的点\(j\)都 ...
- USB限流芯片,4.8A最大,过压关闭6V
PW1503,PW1502是超低RDS(ON)开关,具有可编程的电流限制,以保护电源源于过电流和短路保护.它具有超温保护以及反向闭锁功能. PW1503,PW1502采用薄型(1毫米)5针薄型SOT2 ...
- 阿里云VOD(一)
一.阿里云视频点播 1.功能介绍 视频点播(ApsaraVideo VoD,简称VoD)是集视频采集.编辑.上传.媒体资源管理.自动化转码处理(窄带高清TM).视频审核分析.分发加速于一体的一站式音视 ...
- SpringIOC的注解应用
SpringIOC的注解应用 在之前的项目中,我们都是通过xml文件进行bean或者某些属性的赋值,其实还有另外一种注解的方式,在企业开发中使用的很多,在bean上添加注解,可以快速的将bean注 ...
- 重磅:保姆级Java技术图谱发布!够学到元宵节了,赶紧收藏!
最近因为参与社群交流的时间比较多,除了唠唠白酒的嗑之外,很大一部分时间都是看到群里问到一些关于Spring Boot和Spring Cloud应用过程中碰到的问题以及一些开发过程中的报错信息.在这些帮 ...
- MySQL安装+初始化操作(1)
先去官网下载自己适合的版本,在这里我选择下载Windows 64位版本的,这是下载地址. 1.下载MySQL,步骤①==>步骤② 2.下载后,解压到除系统盘(C盘)之外的其他盘中 3.解压后在b ...