夏季特惠

题目描述

S t e a m   2019 Steam\ 2019 Steam 2019年夏季促销开始了!

Y Y Y同学决定⼊⼿⼀些游戏,⼩Y同学⼀共有 x x x元的预算,该平台上所有的 n n n个游戏均有折扣,标号为 i i i的游戏的原价 a i ai ai元,现价只要 b i bi bi元(也就是说该游戏可以优惠 a i − b i ai−bi aibi元,每款游戏最多只能购买⼀次),并且⼩ Y Y Y同学购买该游戏能获得快乐值为 w i wi wi

由于优惠的存在,⼩ Y Y Y作为剁⼿党可能做出⼀些冲动消费导致最终买游戏的总费⽤超过预算,但只要满足获得的总优惠金额不低于超过预算的总金额,那在⼩ Y Y Y同学⼼理上就不会觉得吃亏(买到就是赚到!真⾹!)。现在⼩Y希望在⼼理上不觉得吃亏的前提下,获得尽可能多的快乐值。
输入格式
第⼀⾏包含两个数 n n n x x x。接下来 n n n⾏包含每个游戏的信息,原价 a i ai ai,现价 b i bi bi,能获得的快乐值为 w i wi wi
输出格式
输出⼀个数字,表⽰⼩ Y Y Y同学能获得的最⼤快乐值。

思路

我们输入 a i , b i , w i ai,bi,wi ai,bi,wi时。
如果 2 ∗ b i − a i < = 0 2*bi-ai<=0 2biai<=0,这件物品我们就必须要,为什么?因为我们买了这个物品的话,我们不亏,也就是我们得到的优惠一定大于或等于使用的钱,对后面的选择完全没有影响,我们买了的话,有可能会有得赚,何乐而不为呢?

剩下的物品,就直接一个 01 01 01背包。

代码

#include <bits/stdc++.h>
using namespace std;
long long m,n,len,f[1000005],ans;
struct node{ long long y,z; }a[505];

int main() {
	scanf("%lld %lld",&n,&m);
	for(long long i=1,ai,bi,ci;i<=n;i++) {
		scanf("%lld %lld %lld",&ai,&bi,&ci);
		long long vi=bi*2-ai;
		if(vi<=0) m-=vi,ans+=ci;
		else a[++len].y=vi,a[len].z=ci;
	}
	for(long long i=1;i<=len;i++) {
		for(long long j=m;j>=a[i].y;j--) {
			if(f[j-a[i].y]+a[i].z>f[j])
				f[j]=f[j-a[i].y]+a[i].z;			
		}
	}
	printf("%lld",f[m]+ans);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值