一、题型
例题: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]);}}
