[程序员的常用算法]之动态规划-背包问题

1.背景

算法在面试中经常问到....

2.代码

package com.ldp.algorithm.demo01;

import org.junit.Test;
import java.util.Arrays;

/**
 * @create 05/18 9:23
 * @description <p>
 * 动态规划-背包问题
 * </p>
 */
public class Test03BeiBao {
    @Test
    public void test() {
        method();
    }

    public void method() {
        // 物品的重量
        int[] w = {1, 4, 3};
        // 物品的价值
        int[] val = {1500, 3000, 2000};
        // 背包的容量
        int m = 4;
        // 物品的个数
        int n = val.length;
        //  v[i][j]创建二维数组,表示前i个商品放入背包容量为j的包中的最大价值
        int[][] v = new int[n + 1][m + 1];
        // 记录放入的商品
        int[][] path = new int[n + 1][m + 1];
        // 第一列设置为0
        for (int i = 0; i < v.length; i++) {
            v[i][0] = 0;
        }
        // 第一行设置为0
        for (int i = 0; i < v[0].length; i++) {
            v[0][i] = 0;
        }
        // 根据公式
        for (int i = 1; i < v.length; i++) { // 第一行不处理,默认为零
            for (int j = 1; j < v[0].length; j++) {// 第一列不处理,默认为零
                // 公式
                if (w[i - 1] > j) {
                    v[i][j] = v[i - 1][j];
                } else {
                    if (v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) {
                        v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
                        // 记录放入数据
                        path[i][j] = 1;
                    } else {
                        v[i][j] = v[i - 1][j];
                    }
                }
            }
        }
        print(v);
        // 查看放入背包的商品
        int i = v.length - 1;
        int j = v[0].length - 1;
        while (i >= 0 && j >= 0) {
            if (path[i][j] == 1) {
                System.out.printf("商品%s放入背包,重量:%s,价值:%s \n", i, w[i - 1], val[i - 1]);
                j -= w[i - 1];
            }
            i--;
        }
    }

    public void print(int[][] v) {
        for (int i = 0; i < v.length; i++) {
            System.out.println(Arrays.toString(v[i]) + "\t");
        }
    }
}

 

完美!

posted @ 2022-05-21 12:26  不停学  阅读(35)  评论(0)    收藏  举报