3466 ACM Proud Merchants 变形的01背包
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3466
题意:假设你有M元,已经Pi,Qi,Vi(i为角标,1<i<N),当M>Qi,时才能购买该商品,得到价值Vi,问得到的最大的价值。
思路:知道是变形的01背包问题,但是思考了很久不知道怎么解决,于是看了好几种不同款式的大佬的代码和证明才看懂,如下是自己写的证明:
如果不改变,直接用01背包的话呢,就是:
for(int i=0;i<n;i++)
for(int j=v;j>=a[i].Q,j--)
dp[i]=max(dp[j],dp[j-a[i].P]+a[i].v);
这个dp使用前是没有对商品排序的,就是商品的购买顺序本该对他没影响,但是在本题中购买a->b,和购买b->a,是不一样的,
假设有两组数据:
2 M
a:P1,Q1,V1
b:P2,Q2,V2
a->b 需要的背包容量:P1+Q2
b->a 需要的背包容量:P2+Q1
自然我们需要剩下背包的容量更大的方案进行购买,及如果a->b,就有:P1+Q2<P2+Q1 移项为 Q1-P1>Q2-P2,也就是说我们每次选择时都希望购买 Q-P更大的商品;
但是对应我们的dp:
for(i = 0;i<n;i++)
for(j = m;j>=a[i].Q;j--)
dp[j] = max(dp[j],dp[j-a[i].P]+a[i].v);
实质是:当满足j>=a[i].Q时,就马上确定购买物品i,然后再用剩下的j-a[i].P去购买最大价值,i的购买顺序是先于j-a[i].P的,所以dp的顺序就希望从Q-P小的先dp,
于是用sort排序,由于默认是升序,但是本题中:
sort(a,a+n)会出错,因为有a.p,a.Q.a.v,a.ca,多个a,会不知道是哪一个a作为首地址,a+n作为尾地址。
于是先写下:
bool cmp(note A,note B)
{
return A.ca < B.ca;
}
再
sort(a,a+n,cmp)
就知道是a.ca了
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[5010];
struct note
{
int P,Q,v;
int ca;
} a[510];
bool cmp(note A,note B)
{
return A.ca < B.ca;
}
int main()
{
int n,m,i,j;
while(~scanf("%d%d",&n,&m))
{
for(i = 0;i<n;i++)
{
scanf("%d%d%d",&a[i].P,&a[i].Q,&a[i].v);
a[i].ca = a[i].Q-a[i].P;
}
sort(a,a+n,cmp);
memset(dp,0,sizeof(dp));
for(i = 0;i<n;i++)
for(j = m;j>=a[i].Q;j--)
dp[j] = max(dp[j],dp[j-a[i].P]+a[i].v);
printf("%d\n",dp[m]);
}
}
3466 ACM Proud Merchants 变形的01背包的更多相关文章
- HDU 3466 Proud Merchants【贪心 + 01背包】
Recently, iSea went to an ancient country. For such a long time, it was the most wealthy and powerfu ...
- hdu 3466 Proud Merchants 【限制性01背包】+【贪心】
题目链接:https://vjudge.net/contest/103424#problem/J 转载于:https://www.bbsmax.com/A/RnJW16GRdq/ 题目大意: 有n个商 ...
- [HDOJ3466]Proud Merchants(贪心+01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3466 n个商人,每个商人有一个物品,物品有价格p.价值v还有一个交易限制q.q的意义是假如你现在拥有的 ...
- Proud Merchants HDU - 3466 (思路题--有排序的01背包)
Recently, iSea went to an ancient country. For such a long time, it was the most wealthy and powerfu ...
- Proud Merchants---hdu3466(有01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3466 与顺序有关的01背包. 如果一个物品p = 5,q = 7,一个物品p = 5,q = 9,如果 ...
- 2955 ACM 杭电 抢银行 01背包 乘法
题意: 强盗抢银行,在不被抓住的情况下,想尽量多的偷点钱.已知各个银行的金钱和被抓的概率,以及强盗能容忍的最大不被抓的概率(小于等于该概率才能不被抓),求最多能抢到钱? 并不是简单的01背包问题? 1 ...
- 杭店 ACM 1864 最大报销额 01背包
![勾选C++才能过 题意: 先规定可以报销一定额度的发票,物品类型有A,B,C,三种.要求每张发票总额不得超过1000元,单项物品不得超过600.求报销的最大额 分析: 先找到合格的发票,然后再挑选 ...
- ZOJ3211-Dream City(贪心思想+变形的01背包)
Dream City Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Sta ...
- 2602 ACM 杭电 骨头容器 01背包
题意:装骨头的容器大小固定,有一堆骨头,已知骨头的价值和大小,在不超过容积大小的情况下,问:所装骨头的最大价值? 思路:典型的01背包问题,不需要有任何的变动. 模板: for(int j=v;j&g ...
随机推荐
- 支付宝WAP支付总结
一:支付宝开放文档: 支付宝手机网站支付的开发文档: https://docs.open.alipay.com/203 二:配置应用环境: 开发者调用接口前需要先生成RSA2密钥,RSA2密钥包含应用 ...
- Java 11 这 8 个逆天新特性教你写出更牛逼的代码!
美国时间2018年 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Jav ...
- pycharm提示This inspection detects instance attribute definition outside __init__ method
示例代码: class MiNiCarStore(CarStore): def createCar(self, typeName): self.carFactory = CarFactory() # ...
- How to disable Microsoft Compatibility Telemetry
Issue: How to disable Microsoft Compatibility Telemetry (CompatTelRunner.exe)? Option : Disable Mi ...
- Go语言之匿名函数
匿名函数和字面量函数一样, 凡是可以使用字面量函数的地方,都可以用匿名函数代替. 这个和js中的匿名函数差不多吧. package main import "fmt" var su ...
- Java集合中List,Set以及Map等集合体系详解(史上最全)
https://blog.csdn.net/zhangqunshuai/article/details/80660974
- -webkit-,-moz-,-ms-,-o-具体指什么了?
-webkit-,-moz-,-ms-,-o-具体指什么了? -webkit-,-moz-,-ms-,-o-是指浏览器私有前缀名. 那为什么要有私有前缀呢? 因为制定HTML和CSS标准的组织W3C动 ...
- Ncurses - Panel
当你需要创建许多窗口时,你很快就会发现它们会变得难以管理.Panel library提供了很好的解决方案. Panel 实际上是一个窗口,通过容器 - 栈 来管理,栈顶的 panel 是完全可见的,其 ...
- BZOJ 3745
题解: 分治好题 首先暴力显然rmq可以做到n^2 比较容易想到是以最值分治,这样在数据随机复杂度是nlogn,不随机还是n^2的 以最值分治只有做多与较小区间复杂度相同才是nlogn的 而这题里我们 ...
- aws上ecs上tomcat8080端口打开但是无法访问
参考: https://yq.aliyun.com/articles/92050?t=t1 1. 安全组设置 2. 防火墙规则 3. 查看 8080 端口是否绑定到 127.0.0.1上的.如果是 ...