1.题目
2.基本思路
3. 代码实现
二维DP
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N=sc.nextInt();
int V=sc.nextInt();
int v[]=new int[N+1];
int w[]=new int[N+1];
int s[]=new int[N+1];
for (int i = 1; i <=N; i++) {
v[i]=sc.nextInt();
w[i]=sc.nextInt();
s[i]=sc.nextInt();
}
int f[][]=new int[N+1][V+1];
for (int i = 1; i <=N; i++) {//枚举背包里所有的数
for (int j = 0; j <=V; j++) {//枚举体积
for (int k = 0; k <=s[i]&&k*v[i]<=j ; k++) {
f[i][j]=Math.max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
}
}
}
System.out.println(f[N][V]);
}
}
优化成空间一维
import java.util.Scanner;
public class _4_多重背包_dp {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int V = sc.nextInt();
int v[] = new int[N + 1];
int w[] = new int[N + 1];
int s[] = new int[N + 1];
for (int i = 1; i <= N; i++) {
v[i] = sc.nextInt();
w[i] = sc.nextInt();
s[i] = sc.nextInt();
}
int dp[] = new int[V + 1];//dp[i]表示容量为i的最大价值
for (int i = 1; i <= N; i++) {
for (int j = V; j >= 1; j--) {
for (int k = 1; k <= s[i] && k <= j / v[i]; k++) {
dp[j] = Math.max(dp[j], dp[j - k * v[i]] + k * w[i]);
//状态表达式 每次可以选k个体积为v的数量
}
}
}
System.out.println(dp[V]);
}
}