Toyan

导航

背包九讲

背包九讲视频来源:背包九讲专题

背包九讲题库: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 }
View Code

完全背包

 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 }
View Code

多重背包问题 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 }
View Code

 

posted on 2020-04-25 19:04  Toyan  阅读(377)  评论(0编辑  收藏  举报