博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【动态规划】0-1背包问题原理和实现
阅读量:6707 次
发布时间:2019-06-25

本文共 2785 字,大约阅读时间需要 9 分钟。

  • 0 1背包——每种物品只能选0件或者1件
/**     * weight[] = {2,3,4,5}     * value[]  = {3,4,5,7}     * 求解满足小于背包最大承重得到最大价值的物品存放策略     * 思路核心:     *      1. 当前取物品的重量weight[i-1] <= j 当前能取最大重量     *      2. 比较价值:不放这个物品的最高价值 和 放入此物品的最高价值     *          maxValue[i-1][j]  不放这个物品的最高价值     *          value[i-1] + maxValue[i-1][j-weight[i-1]]  当前物品价值 + 放入当前物品的前i-1个物品的最高价值     *       -------------------------------------------------------     *      | i\j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9  |     *       -------------------------------------------------------     *      |  0  | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0  |     *       -------------------------------------------------------     *      |  1  | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3  |     *       -------------------------------------------------------     *      |  2  | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 | 7  |     *       -------------------------------------------------------     *      |  3  | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 9 | 12 |     *       -------------------------------------------------------     *      |  4  | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 10| 11| 12 |     *       -------------------------------------------------------     * eg:     *      i=3,j=2;     *      weight[3-1] = 4 > j -----> maxValue[3-1][2] = maxValue[2-1][2] = 3     *     *      i=3,j=4;     *      weight[3-1] = 4 <= j 成立     *      maxValue[3-1][4] = 4 不放这个物品的最高价值     *      value[3-1] + maxValue[2][4-4] =5 + 0 = 5 > 4   当前物品价值 + 放入当前物品的前i-1个物品的最高价值     */    public static int getMaxValue(int[] weight, int[] value, int maxWeight) {        int n = weight.length;//物品数目        // 定义最大价值二维数组,从0开始,各维度需加一个长度        int[][] maxValue = new int[n + 1][maxWeight + 1];        // 最大重量和物品数为0,价值为0        for (int w = 0; w < maxWeight + 1; w++) {            maxValue[0][w] = 0;        }        for (int i = 0; i < n + 1; i++) {            maxValue[i][0] = 0;        }        //  只拿前i件物品(最大价值从0开始,对应的weight和value取i-1)        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= maxWeight; j++) {                // 先假定当前物品的最大价值等于放上一件的最大价值                maxValue[i][j] = maxValue[i - 1][j];                // 当前物品的重量小于等于总重量                if (weight[i - 1] <=j) {                    // 比较 不放这个物品的最高价值 和 放入此物品的最高价值                    if (value[i - 1] + maxValue[i - 1][j - weight[i - 1]] > maxValue[i - 1][j]) {                        maxValue[i][j] = value[i - 1] + maxValue[i - 1][j - weight[i - 1]];                    }                }            }        }        return maxValue[n][maxWeight];    }    public static void main(String[] args){        int weight[]={2,3,4,5};        int value[]={3,4,5,7};        int maxWeight=9;        System.out.println(getMaxValue(weight,value,maxWeight));    }

 

转载于:https://www.cnblogs.com/bloghxr/p/10422485.html

你可能感兴趣的文章
Android 悬浮窗权限校验
查看>>
mysql 创建数据库 并设置utf8格式
查看>>
IDA 逆向工程 反汇编使用
查看>>
CentOS7单独安装Apache Bench压力测试工具
查看>>
python植入后门backdoor程序的方法?
查看>>
WPF 使用 Direct2D1 画图 绘制基本图形
查看>>
导入其他python文件或者python文件的函数
查看>>
80端口被NT kernel & System 占用pid 4
查看>>
Multiverse in Doctor Strange // Multiverse在《神秘博士》
查看>>
ASP.NET MVC(Razor)上运用UEditor和xhEditor编辑器检测到有潜在危险的 Request.Form的真正解决办法...
查看>>
android Fragment
查看>>
java 、Android 提交参数转码问题
查看>>
iOS UIScrollView 停止滑动 减速
查看>>
[Codility] CommonPrimeDivisors
查看>>
GIS API乱弹
查看>>
对https的理解
查看>>
七周七语言(6)
查看>>
解决delphi10.2.3 android tools闪退
查看>>
在ASP.NET Atlas中创建自定义的Action
查看>>
深度观察:腾讯收购大众点评背景下的O2O大格局
查看>>