79-背包与魔法(蓝桥杯)

问题描述

小蓝面前有 N 件物品, 其中第 i 件重量是 Wi​, 价值是 Vi​ 。她还有一个背包, 最大承重是 M 。

小蓝想知道在背包称重范围内, 她最多能装总价值多少的物品?

特别值得一提的是, 小蓝可以使用一个魔法 (总共使用一次), 将一件物品 的重量增加 K, 同时价值秝倍。(当然小蓝也可以不使用魔法)

输入格式

第一行包含 3 个整数 N、M 和 K 。

以下 N 行, 每行两个整数 Wi​ 和 Vi​ 。

输出格式

一个整数代表答案。

样例输入

3 10 3
5 10
4 9
3 8

样例输出

26

样例说明

选择第二件和第三件物品, 同时对第二件物品使用魔法。

评测用例规模与约定

对于 30% 的数据, 1≤N,M,K≤100.

对于 100% 的数据, 1≤N≤2000,1≤M,K≤10000,0≤Wi​,Vi​≤10000.

运行限制

语言最大运行时间最大运行内存
C++1s256M
C1s256M
Java3s256M
Python35s256M

源码:

import java.util.Scanner;

public class 背包与魔法 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n=scanner.nextInt();
		int m=scanner.nextInt();
		int k=scanner.nextInt();
		int[] w=new int[n+1];
		int[] v=new int[n+1];
		int[][] dp=new int[2][m+1];
		int[] ww=new int[n+1];
		int[] vv=new int[n+1];
		for (int i = 0; i < n; i++) {
			w[i]=scanner.nextInt();
			v[i]=scanner.nextInt();
			ww[i]=w[i]+k;
			vv[i]=v[i]*2;
			for (int j = m; j >= w[i]; j--) { //用了魔法不是在该物品上用的
				dp[1][j]=Math.max(dp[1][j], dp[1][j-w[i]]+v[i]);
			}
			for (int j = m; j >= ww[i]; j--) { //用了魔法是在该物品上用的
				dp[1][j]=Math.max(dp[1][j], dp[0][j-ww[i]]+vv[i]);
			}
			for (int j = m; j >= w[i]; j--) { //没用魔法
				dp[0][j]=Math.max(dp[0][j], dp[0][j-w[i]]+v[i]);
			}
		}
		System.out.println(Math.max(dp[0][m], dp[1][m]));
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮被咬碎成星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值