01背包 -动态规划-简单思路-只需三步

01背包 -动态规划-java实现

题目:
给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?




step1:状态和选择

1.状态:背包容量、可选择的物品。
2.选择: 物体装进背包、不装进背包


step2:定义dp table

明确dp table的定义:
dp[i][w]含义为:对前i个物体时,剩余容量为w,有最大价值dp[i][w]。


step3:通过“选择”来确定“状态转移方程”

1. 首先考虑:背包剩余容量一定装不下第i个物体:

			则	dp[i][w]=dp[i-1][w];

2. 装入还是不装入 ,择优处理:

在dp[i-1][w-wt[i-1]]+val[i-1] 和	dp[i-1][w]选较大值

就这样一直处理到对前N个物体,剩余容量为W的最终情况,得出完整dp表







话不多说上代码:
在这里插入图片描述
输出:
在这里插入图片描述



具体代码实现:(IDEA通过)

public class Bag0_1_ {
    
    
    public int[] wt;
    public int[] val;
    public static void main(String[] args) {
    
    
        int w[] = {
    
    4, 2, 3, 6, 5, 6};
        int val[] = {
    
    6, 4, 8, 9, 10, 4};
        System.out.println(fun(12,6,w,val));
    }
    static int max(int a, int b) {
    
    
        return a > b ? a : b;
    }
    //容量为w的背包,来装n个物体。
    static int fun(int W, int N, int wt[], int val[]) {
    
    
        int[][] dp = new int[N + 1][W + 1];//dp[i][w]表示剩余容量为w时,装入前i个物体。
        for (int i = 1; i <= N; ++i) {
    
    
            for (int w = 1; w <= W; ++w) {
    
    
                if (w - wt[i - 1] < 0)
                    dp[i][w] = dp[i - 1][w];//当前背包的容量装不下第i个。
                else {
    
    
                    dp[i][w] = max(dp[i - 1][w - wt[i - 1]] + val[i - 1], dp[i - 1][w]);
                }                           //装入或者不装入背包,择优。
            }
        }
        for (int i = 1; i <= N; i++) {
    
    
            for (int j = 1; j <=W; j++) {
    
    
                System.out.print(dp[i][j] + "\t");
            }
            System.out.println();
        }
        return dp[N][W];
    }
}

/*
0	0	0	6	6	6	6	6	6	6	6	6
0	4	4	6	6	10	10	10	10	10	10	10
0	4	8	8	12	12	14	14	18	18	18	18
0	4	8	8	12	12	14	14	18	18	21	21
0	4	8	8	12	12	14	18	18	22	22	24
0	4	8	8	12	12	14	18	18	22	22	24
24
*/


猜你喜欢

转载自blog.csdn.net/weixin_46443659/article/details/109142419