一、题型
例题:https://www.acwing.com/problem/content/description/9/
N组物品,每组有s个物品,每个物品的体积v,价值w,每组只能选一个物品,问如何选价值最大
二、思路
三、代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m=in.nextInt();
int[][] v=new int[105][105];
int[][] w=new int[105][105];
int[][] f=new int[105][105];
int[] s = new int[105];
for(int i=1;i<=n;i++){
s[i] = in.nextInt();
for(int k = 1;k<=s[i];k++){
v[i][k]=in.nextInt();
w[i][k]=in.nextInt();
}
}
for(int i=1;i<=n;i++){
for(int j = 0;j<=m;j++){
f[i][j] = f[i-1][j];
for(int k = 1;k<=s[i];k++) {
if(j>=v[i][k]) f[i][j]=Math.max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
}
}
}
System.out.println(f[n][m]);
}
}
四、一维优化
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m=in.nextInt();
int[][] v=new int[105][105];
int[][] w=new int[105][105];
int[] f=new int[105];
int[] s = new int[105];
for(int i=1;i<=n;i++){
s[i] = in.nextInt();
for(int k = 1;k<=s[i];k++){
v[i][k]=in.nextInt();
w[i][k]=in.nextInt();
}
}
for(int i=1;i<=n;i++){
for(int j = m;j>=0;j--){
for(int k = 1;k<=s[i];k++) {
if(j>=v[i][k]) f[j]=Math.max(f[j],f[j-v[i][k]]+w[i][k]);
}
}
}
System.out.println(f[m]);
}
}