动态规划 背包问题

 1 /**
 2  * @author: yekai  <br/>
 3  * Date: 2021/12/18:21:53  <br/>
 4  * Description:动态规划-背包问题
 5  * 解题思路:
 6  * 1明确状态:背包的空余容量,可选择的物品
 7  * 2明确转移
 8  */
 9 public class main {
10     public static void main(String[] args) {
11         int N = 3;
12         int W = 4;
13         int[] val = {4, 2, 3};
14         int[] wt = {2, 1, 3};
15         int max = knapsnack(W, N, val, wt);
16         System.out.println(max);
17     }
18 
19     private static int knapsnack(int W, int N, int[] val, int[] wt) {
20         //dp数组初始化:代表前N个物品中,空余容量在w下的最大价值
21         int[][] dp = new int[N + 1][W + 1];
22         for (int i = 1; i <= N; i++) {
23             for (int w = 1; w <= W; w++) {
24                 if (w - wt[i - 1] < 0) {
25                     //放不进去了
26                     dp[i][w] = dp[i - 1][w];
27                 } else {
28                     dp[i][w] = Math.max(
29                             //放进去:i的值加上i-1的最大价值
30                             val[i - 1] + dp[i - 1][w - wt[i - 1]],
31                             //不放进去
32                             dp[i - 1][w]
33                     );
34                 }
35             }
36         }
37         return dp[N][W];
38     }
39 }

 

posted @ 2021-12-18 22:15  yekaiIT  阅读(21)  评论(0编辑  收藏  举报