题目
现有一个容量大小为V的背包和N件物品,每件物品有两个属性,体积和价值,请问这个背包最多能装价值为多少的物品?
链接:https://www.nowcoder.com/questionTerminal/708f0442863a46279cce582c4f508658
来源:牛客网
输入描述:
第一行两个整数V和n。
接下来n行,每行两个整数体积和价值。1≤N≤1000,1≤V≤20000。
每件物品的体积和价值范围在[1,500]。
输出描述:
输出背包最多能装的物品价值。
示例1
输入
6 3
3 5
2 4
4 2
输出
9
import java.util.Scanner;
public class Package {
/*
* 背包总容量6
*
* 三组数据
* 容量3 价值5
* 容量2 价值4
* 容量4 价值2
*
* */
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
/*
* 背包容量*/
int packMax = scanner.nextInt();
int n = scanner.nextInt();
Thing[] things = new Thing[n];
for (int i = 0; i < n; i++) {
int curVo = scanner.nextInt();
int curMoney = scanner.nextInt();
Thing thing = new Thing(curVo, curMoney);
things[i] = thing;
}
/*定义数组,保存背包每一个体积对应的价值*/
int[] packMoneyArr = new int[packMax + 1];
for (int j = 0; j < n; j++) {
for (int k = packMax; k > 0; k--) {
int max = packMoneyArr[k];
int packLeft = k - things[j].vo;
if (packLeft >= 0
&& max < things[j].money + packMoneyArr[packLeft]) {
max = things[j].money + packMoneyArr[packLeft];
}
if (max > packMoneyArr[k]) {
packMoneyArr[k] = max;
}
}
}
System.out.println(packMoneyArr[packMax]);
}
}
class Thing {
int vo;// 容量
int money;// 价值
public Thing(int vo, int money) {
this.vo = vo;
this.money = money;
}
}