题目描述
第1行有2个整数,物品种数n和背包装载体积v;
第2行到i+1行每行3个整数,为第i种物品的数量m、体积w、价值s。
示例
输入:
2 10
3 4 3
2 2 5
输出:
13
参考解法
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
private static class Good {
int w;
int s;
public Good(int w, int s) {
this.w = w;
this.s = s;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int v = scanner.nextInt();
List<Good> goods = new ArrayList<>();
for (int i = 0; i < n; i++) {
int m = scanner.nextInt(),
int w = scanner.nextInt(),
int s = scanner.nextInt();
for (int j = 0; j < m; j++) {
goods.add(new Good(w, s));
}
}
System.out.println(solve(goods, v));
}
private static int solve(List<Good> goods, int v) {
int[] dp = new int[v + 1];
for (int i = 0; i < goods.size(); i++) {
Good good = goods.get(i);
for (int j = v; j >= 1; j--) {
if (j >= good.w) {
dp[j] = Math.max(dp[j], dp[j - good.w] + good.s);
}
}
}
return dp[v];
}
}
简化版
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int v = in.nextInt();
int[] dp = new int[v+1];
for(int i = 0; i < n; i++) {
int n1 = in.nextInt();
int n2 = in.nextInt();
int n3 = in.nextInt();
for(int j = 0; j < n1; j++) {
for(int k = v; k >= 1; k--) {
if(k >= n2) {
dp[k] = Math.max(dp[k], dp[k-n2] + n3);
}
}
}
}
System.out.println(dp[v]);
}
}