zoukankan      html  css  js  c++  java
  • 动态规划之01背包问题

    package com.baozi.dynamicproblem;
    
    /**
     * 01背包问题--动态规划思想解决
     *
     * @author BaoZi
     * @create 2019-07-06-10:51
     */
    public class KnapsackProblem {
        public static void main(String[] args) {
            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];
    
            //首先初始化第一行和第一列
            for (int i = 0; i < v[0].length; i++) {
                v[0][i] = 0;
            }
            for (int i = 0; i < v.length; i++) {
                v[i][0] = 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];
                        }
                    }
                }
            }
            for (int i = 0; i < v.length; i++) {
                for (int j = 0; j < v[0].length; j++) {
                    System.out.print(v[i][j] + " ");
                }
                System.out.println();
            }
            //行的最大下标
            int i = path.length - 1;
            //列的最大下标
            int j = path[0].length - 1;
            while (i > 0 && j > 0) {//这里是从path 的最后一个元素开始查找
                if (path[i][j] == 1) {
                    System.out.printf("第%d个商品放入到背包中
    ", i);
                    j = j - w[i - 1];
                }
                i--;
            }
        }
    }
  • 相关阅读:
    Web 应用的 UML 建模与 .NET 框架开发
    UML类详解
    学习Pythod 有感
    树形结构应用技巧
    面向对象的设计原则-类设计原则
    prototype 学习
    php framework kohana 学习2
    用批命令更新数据库
    HashTable
    jquery 调用wcf project
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/11146558.html
Copyright © 2011-2022 走看看