一、题型

例题:https://www.acwing.com/problem/content/description/9/
N组物品,每组有s个物品,每个物品的体积v,价值w,每组只能选一个物品,问如何选价值最大

二、思路

![0{WDORPL~F7}ZUN[6((BVA.png](https://cdn.nlark.com/yuque/0/2022/png/12497718/1649580944791-d45152be-ab24-4ea8-ae67-2ac17745f188.png#clientId=u9604f5da-b05d-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=uef4f8580&margin=%5Bobject%20Object%5D&name=0%7BWDORPL~F7%7DZUN%5B6%28%28BVA.png&originHeight=521&originWidth=1173&originalType=binary&ratio=1&rotation=0&showTitle=false&size=101254&status=done&style=none&taskId=u2de0263f-6568-4de3-a549-ccde891aa09&title=)

三、代码

  1. import java.util.Scanner;
  2. public class Main{
  3. public static void main(String[] args){
  4. Scanner in = new Scanner(System.in);
  5. int n = in.nextInt();
  6. int m=in.nextInt();
  7. int[][] v=new int[105][105];
  8. int[][] w=new int[105][105];
  9. int[][] f=new int[105][105];
  10. int[] s = new int[105];
  11. for(int i=1;i<=n;i++){
  12. s[i] = in.nextInt();
  13. for(int k = 1;k<=s[i];k++){
  14. v[i][k]=in.nextInt();
  15. w[i][k]=in.nextInt();
  16. }
  17. }
  18. for(int i=1;i<=n;i++){
  19. for(int j = 0;j<=m;j++){
  20. f[i][j] = f[i-1][j];
  21. for(int k = 1;k<=s[i];k++) {
  22. if(j>=v[i][k]) f[i][j]=Math.max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
  23. }
  24. }
  25. }
  26. System.out.println(f[n][m]);
  27. }
  28. }

四、一维优化

  1. import java.util.Scanner;
  2. public class Main{
  3. public static void main(String[] args){
  4. Scanner in = new Scanner(System.in);
  5. int n = in.nextInt();
  6. int m=in.nextInt();
  7. int[][] v=new int[105][105];
  8. int[][] w=new int[105][105];
  9. int[] f=new int[105];
  10. int[] s = new int[105];
  11. for(int i=1;i<=n;i++){
  12. s[i] = in.nextInt();
  13. for(int k = 1;k<=s[i];k++){
  14. v[i][k]=in.nextInt();
  15. w[i][k]=in.nextInt();
  16. }
  17. }
  18. for(int i=1;i<=n;i++){
  19. for(int j = m;j>=0;j--){
  20. for(int k = 1;k<=s[i];k++) {
  21. if(j>=v[i][k]) f[j]=Math.max(f[j],f[j-v[i][k]]+w[i][k]);
  22. }
  23. }
  24. }
  25. System.out.println(f[m]);
  26. }
  27. }