背包九讲
背包九讲视频来源:背包九讲专题
背包九讲题库:AcWing题库
01背包
1 import java.util.*; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 int N = sc.nextInt(); 7 int V = sc.nextInt(); 8 int[] v = new int[N + 1]; 9 int[] w = new int[N + 1]; 10 for (int i = 1; i <= N; i++) { 11 v[i] = sc.nextInt(); 12 w[i] = sc.nextInt(); 13 } 14 int res = helper2(N, V, v, w); 15 System.out.println(res); 16 } 17 18 /** 19 * dp[i][j] 表示前i个物品,在最大体积为j的时候的最大值 20 * dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - v[i]] + w[i]) 21 */ 22 private static int helper(int N, int V, int[] v, int[] w) { 23 int[][] dp = new int[N + 1][V + 1]; 24 25 for (int i = 1; i <= N; i++) { 26 for (int j = 0; j <= V; j++) { 27 if (j - v[i] >= 0) { 28 dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i]); 29 } else { 30 dp[i][j] = dp[i - 1][j]; 31 } 32 } 33 } 34 return dp[N][V]; 35 } 36 37 /** 38 * 由于二维数组之后只有一维有用,可以压缩 39 * dp[j]表示体积为j的情况下最大的价值 40 * 要从大到小循环,因为要用未覆盖的值 41 */ 42 private static int helper2(int N, int V, int[] v, int[] w) { 43 int[] dp = new int[V + 1]; 44 45 for (int i = 1; i <= N; i++) { 46 for (int j = V; j >= v[i]; j--) { 47 dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]); 48 } 49 } 50 return dp[V]; 51 } 52 }
完全背包
1 import java.util.*; 2 3 /** 4 * 完全背包问题 5 * @Author: hta 6 * @Date: 2020/04/25 7 * @Time: 19:16 8 */ 9 public class Main { 10 public static void main(String[] args) { 11 Scanner sc = new Scanner(System.in); 12 int N = sc.nextInt(); 13 int V = sc.nextInt(); 14 int[] v = new int[N + 1]; 15 int[] w = new int[N + 1]; 16 for (int i = 1; i <= N; i++) { 17 v[i] = sc.nextInt(); 18 w[i] = sc.nextInt(); 19 } 20 int res = helper(N, V, v, w); 21 System.out.println(res); 22 } 23 24 /** 25 * dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * v[i]] + k * w[i]) 26 * 其中,j - k * v[i] >= 0 27 */ 28 private static int helper(int N, int V, int[] v, int[] w) { 29 int[][] dp = new int[N + 1][V + 1]; 30 31 for (int i = 1; i <= N; i++) { 32 for (int j = 0; j <= V; j++) { 33 for (int k = 0; j - k * v[i] >= 0; k++) { 34 dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * v[i]] + k * w[i]); 35 } 36 } 37 } 38 39 return dp[N][V]; 40 } 41 42 43 private static int helper2(int N, int V, int[] v, int[] w) { 44 int[] dp = new int[V + 1]; 45 46 for (int i = 1; i <= N; i++) { 47 for (int j = 0; j <= V; j++) { 48 for (int k = 0; j - k * v[i] >= 0; k++) { 49 dp[j] = Math.max(dp[j], dp[j - k * v[i]] + k * w[i]); 50 } 51 } 52 } 53 54 return dp[V]; 55 } 56 57 58 private static int helper3(int N, int V, int[] v, int[] w) { 59 int[] dp = new int[V + 1]; 60 61 for (int i = 1; i <= N; i++) { 62 for (int j = v[i]; j <= V; j++) { 63 dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]); 64 } 65 } 66 67 return dp[V]; 68 } 69 }
多重背包问题 I
1 import java.util.Scanner; 2 3 /** 4 * @Author: hta 5 * @Date: 2020/04/25 6 * @Time: 19:52 7 */ 8 public class Main { 9 public static void main(String[] args) { 10 Scanner sc = new Scanner(System.in); 11 int N = sc.nextInt(); 12 int V = sc.nextInt(); 13 int[] v = new int[N + 1]; 14 int[] w = new int[N + 1]; 15 int[] s = new int[N + 1]; 16 for (int i = 1; i <= N; i++) { 17 v[i] = sc.nextInt(); 18 w[i] = sc.nextInt(); 19 s[i] = sc.nextInt(); 20 } 21 int res = helper(N, V, v, w, s); 22 System.out.println(res); 23 } 24 25 /** 26 * dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * v[i] + k * w[i]]) 27 * k < s[i] && j - k * v[i] >= 0 28 */ 29 private static int helper(int N, int V, int[] v, int[] w, int[] s) { 30 int[][] dp = new int[N + 1][V + 1]; 31 32 for (int i = 1; i <= N; i++) { 33 for (int j = 0; j <= V; j++) { 34 for (int k = 0; k <= s[i] && j - k * v[i] >= 0; k++) { 35 dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k * v[i]] + k * w[i]); 36 } 37 } 38 } 39 40 return dp[N][V]; 41 } 42 43 /** 44 * 一维数组记得从后向前更新,要保留旧值 45 */ 46 private static int helper2(int N, int V, int[] v, int[] w, int[] s) { 47 int[] dp = new int[V + 1]; 48 49 for (int i = 1; i <= N; i++) { 50 for (int j = V; j >= 0; j--) { 51 for (int k = 0; k <= s[i] && j - k * v[i] >= 0; k++) { 52 dp[j] = Math.max(dp[j], dp[j - k * v[i]] + k * w[i]); 53 } 54 } 55 } 56 57 return dp[V]; 58 } 59 }