01背包带顺序问题 HDU 3466

博客讨论了一种01背包问题的变种,其中物品的顺序影响购买能力。当iSea有特定金额时,如何获得最高价值的商品组合。博主发现按照传统01背包模板解答会出错,原因是未考虑商品购买顺序。通过分析错误样例,得出结论:商品应根据差值(p1 - q1)排序,以便优先购买使总金额更接近商品总价的物品,从而达到最大价值。
摘要由CSDN通过智能技术生成

最近,iSea去了一个古老的国家。这么长时间以来,它是世界上最富有和最强大的王国。结果,即使这个国家不再富裕,这个国家的人民仍然感到非常自豪。
商家是最典型的商家,每个商家仅售出一件商品,价格为Pi,但如果您的钱少于Qi,他们会拒绝与您进行交易,并且iSea评估每件商品的值为Vi。
如果他有M个货币单位,那么iSea可以获得的最高价值是多少?
输入中有几个测试用例。

每个测试用例均以两个整数N,M(1≤N≤500、1≤M≤5000)开头,指示项目的编号和初始金额。
然后是N行,每行包含三个数字Pi,Qi和Vi(1≤Pi≤Qi≤100,1≤Vi≤1000),其含义在描述中。

输入以文件标记结尾终止。

一看,01背包问题
就自然套了01背包的模板,结果发现WA了

为什么呢,对于背包问题需要更深入的理解

对于这个测试样例
3 10
5 10 5
3 5 6
2 7 3

如果按照原来的背包写
结果就应该是9

为什么?

数组是这样的

5 0 0 0 0 0 0 0 0 0
6 6 6 6 6 6 0 0 0 0
9 9 9 9 6 6 0 0 0 0

先遍历第一个商品只有钱大于10可以买,显然只有第一行第一列为5 (遍历钱是逆序的
然后再遍历第二个物品 这个时候显然在第一个物品的基础上 没法两个一起买
为什么?
看代码

for(int i = 1; i <= n; i++) {
   
			for(int j = m; j >= 1; j--) {
   
				if(j >= node[i].q) {
   
					dp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值