这里只是做一个代码记录,不做背包详解,代码注释都有,应该一看就懂。首先是问题描述如下:
202209182113559.png
  接下来是二维的动态规划和一维的动态规划,Java版本。

import java.util.Scanner;
import java.lang.*;

public class Main{
    public static void main(String[] args){
        // 创建输入的Scanner
        Scanner sc = new Scanner(System.in);
        // 首先读取N和V 也就是物品的数目和背包容量
        int n = sc.nextInt();
        int v = sc.nextInt();
        sc.nextLine();
        // 创建体积数组和价值数组
        int[] volume = new int[n+1];
        int[] value = new int[n+1];
        for(int i = 1;i <= n;++i){
            volume[i] = sc.nextInt();
            value[i] = sc.nextInt();
        }
        // 创建dp数组 dp[number+1][volume+1]
        int[][] dp = new int[n+1][v+1];
        // 首先枚举数目 然后枚举背包容量
        for(int i = 1;i<=n;++i){
            for(int j = 0;j<=v;++j){
                // 先这样赋值 为了之后方便
                dp[i][j] = dp[i-1][j];
                if(j>=volume[i]){
                    // 说明背包能装下 那么背包最大价值从装和不装中产生
                    dp[i][j] = Math.max(dp[i-1][j-volume[i]]+value[i],dp[i][j]);
                }
            }
        }
        // 输出最大价值
        System.out.println(dp[n][v]);
    }
}
import java.util.Scanner;
import java.lang.*;

public class Main{
    public static void main(String[] args){
        // 创建输入的Scanner
        Scanner sc = new Scanner(System.in);
        // 首先读取N和V 也就是物品的数目和背包容量
        int n = sc.nextInt();
        int v = sc.nextInt();
        sc.nextLine();
        // 创建体积数组和价值数组
        int[] volume = new int[n+1];
        int[] value = new int[n+1];
        for(int i = 1;i <= n;++i){
            volume[i] = sc.nextInt();
            value[i] = sc.nextInt();
        }
        // 创建dp数组 dp[number+1][volume+1]
        int[] dp = new int[v+1];
        // 直接枚举背包容量 从大到小枚举 是因为换成一维DP之后 等式右边的是物品数目i-1的dp[j]
        // 如果还是顺序更新那么较小的j会被更新 而较小的j在后面会被用到
        // 如果是逆序更新 那么更新的是大j 大j是不会在后面被用到的
        for(int i = 1;i<=n;++i){
            for(int j = v;j>=volume[i];j--){
                dp[j] = Math.max(dp[j-volume[i]]+value[i],dp[j]);
            }
        }
        System.out.println(dp[v]);
    }
}

Q.E.D.


  Java后端开发工程师一名,北漂一族,欢迎大家前来交流