题目
有 件物品和一个容量是 的背包,背包能承受的最大重量是 。
每件物品只能用一次。体积是 ,重量是 ,价值是 。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。
输出最大价值。
输入格式
第一行三个整数, ,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。
接下来有 行,每行三个整数 ,用空格隔开,分别表示第 件物品的体积、重量和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
输入样例
4 5 6
1 2 3
2 4 4
3 4 5
4 5 6
输出样例:
8
解题
方法一:动态规划
思路
思维过程:
动态规划:
-
状态定义: 表示所有只考虑前 个物品,总体积不大于 且总重量不大于 的所有选法中能得到的最大价值。
-
状态转移方程:
-
初始状态:只考虑前 个物品的时候没有物品可选,最大价值一定是 。
代码
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
int N = (int) in.nval;
in.nextToken();
int V = (int) in.nval;
in.nextToken();
int M = (int) in.nval;
int[][] f = new int[V + 1][M + 1];
for (int i = 0; i < N; ++i) {
in.nextToken();
int v = (int) in.nval;
in.nextToken();
int m = (int) in.nval;
in.nextToken();
int w = (int) in.nval;
for (int j = V; j >= v; --j) {
for (int k = M; k >= m; --k) {
f[j][k] = Math.max(f[j][k], f[j - v][k - m] + w);
}
}
}
System.out.println(f[V][M]);
}
}
评论区