• 动态规划解决0-1背包问题(java)


    1.动态规划解决0-1背包问题

    0-1背包问题:给定n种物品和一个背包.物品i的种类为wi,价值为vi,背包容量为C.问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?

    其中每种物品只有两种选择,即装入背包和不装入背包.

    ##首先找到最优子结构

    ##然后找到递归关系

     

    ##算法描述在下

    通过递归,将所有的结果值保存在一个矩阵中

    /**
     * 动态规划0-1背包算法
     * @author 邹龄晋
     * 答案:15    11001
     */
    public class Demo {
        public static void main(String[] args) {
            int [] w = {2,2,6,5,4};//对应重量
            int [] v = {6,3,5,4,6};//对应价值
            
            int c = 10;//总质量
            int [][] m = new int[v.length][c+1];//定义m二维数组用来表示所有的价值,m[i][j]表示第i物品装入容量为j的背包的最大值
            int [] x = new int[w.length];    //解空间集
            Knapsack(v,w,c,m);
            traceback(m,w,c,x);
            
            System.out.println("m[0][c]="+m[0][c]);
            for(int i=0;i<x.length;i++){
                System.out.print(x[i]+" ");
            }
            System.out.println();
            for(int i=0;i<v.length;i++){
                for(int j=0;j<c+1;j++){
                    System.out.print(m[i][j]+"	");
                }
                System.out.println();
            }
            
        }
        public static void traceback(int [][]m,int []w,int c,int []x){
            int n = w.length-1;
            for(int i=0;i<n;i++)
                if(m[i][c]==m[i+1][c]) x[i] = 0;
                else{
                    x[i] = 1;
                    c-=w[i];
                }
            x[n] = (m[n][c]>0)?1:0;
        }
        
        public static void Knapsack(int v[],int w[],int c,int [][]m){
            int n = v.length-1;
            int jMax = Math.min(w[n]-1, c);
            for(int j=0;j<=jMax;j++) m[n][j] = 0;
            for(int j=w[n];j<=c;j++) m[n][j] = v[n];
            
            for(int i=n-1;i>=0;i--){
                jMax = Math.min(w[i]-1, c);
                for(int j=0;j<=jMax;j++)
                    m[i][j] = m[i+1][j];
                for(int j=w[i];j<=c;j++)
                    m[i][j] = Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
            }
        }
    
    }
    View Code
    m[0][c]=15
    1 1 0 0 1 
    0    0    6    6    9    9    12    12    15    15    15    
    0    0    3    3    6    6    9    9    9    10    11    
    0    0    0    0    6    6    6    6    6    10    11    
    0    0    0    0    6    6    6    6    6    10    10    
    0    0    0    0    6    6    6    6    6    6    6    
    View Code

     看完程序后我们看下面两个图帮助理解

  • 相关阅读:
    《学习之道》第六章习惯的部分-信号
    《学习之道》第六章习惯的组成
    《学习之道》第六章习惯的形成
    《学习之道》第五章小恶魔造成拖延(二)
    《学习之道》第五章拖延的两个小案例
    《学习之道》第五章是借口造成拖延(一)
    《学习之道》第五章认识拖延
    《学习之道》第五章认识“小恶魔”
    《学习之道》第五章分心与拖延
    redis 安装
  • 原文地址:https://www.cnblogs.com/zoulingjin/p/9390796.html
Copyright © 2020-2023  润新知