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

    背包问题学习笔记

    背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] }

    i:表示物品序号

    j:表示背包大小

    Wi:表示第i件物品的重量

    f[i,j]:表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值

    f[i-1,j-Wi]:表示在前i-1件物品中选择若干件放在承重为j-Wi的背包中,可以取得的最大价值

    Pi(j>=Wi):表示第i件物品的价值,要求背包大小j要大于此件物品的重量

    f[i-1,j]:表示前i-1件物品中选择若干件放在承重为j的背包中,可以取得的最大价值

    方程的解释:当前最优 = 之前计算得到的、当前物品数减一、当前背包数减去当前物品重量的剩余容量的最优解  +  当前物品价值(要求当前物品重量大于当前背包数)

                与

                之前计算得到的、当前物品数减一,背包数相同的情况下的最优解

               中较大的数

    import java.util.Arrays;
    
    public class beibaowent {
        /***
         * m:背包数
         * p:物品价值
         * w:物品重量
         * @param p
         * @param w
         * @param m
         * @return
         */
        public static int max(int[]p,int[]w,int m){
            //6行11列数组
            int[][] maxnum = new int[p.length+1][m+1];
            //第一行,背包数0-10,物品数0
            for(int i = 0 ; i < m+1 ;i++){
                maxnum[0][i] = 0;
            }
            //第一列,背包数0,物品数0-5
            for(int i =0 ; i < p.length+1 ; i++){
                maxnum[i][0] = 0;
            }
            for(int i = 1 ; i < m+1 ; i++){ //背包数为10
                for(int j = 1 ; j <p.length+1 ;j++){ //物品数
                    //该物品的价值,如果物品的重量大于背包数,则该物品的价值为0
                    int thisW = w[j-1] > i ? 0 :p[j-1]; 
                    //将该物品放入背包后,能得到的最大价值
                    int one;
                    if(thisW == 0){
                        one = 0;
                    }else{
                        one = maxnum[j-1][i-w[j-1]]+thisW;
                    }
                    //不将该物品放入背包,在此背包数下能得到的最大价值
                    int two = maxnum[j-1][i];
                    
                    maxnum[j][i] = one > two ? one : two;
                }
            }
            for(int i =0 ; i < p.length+1 ; i++){
                maxnum[i][0] = 0;
                System.out.println(Arrays.toString(maxnum[i]));
            }
            return 0;
        }
        
        public static void main(String[] args) {
            int[] p ={6,4,5,3,6};
            int[] w ={4,5,6,2,2};
            
            max(p,w,10);
        }
    }

     参考地址:http://blog.csdn.net/mu399/article/details/7722810

  • 相关阅读:
    libjpeg的问题
    CURLcode的定义
    libcurl断点下载遇到的问题
    itunes connect
    node.js模块的坑
    itunes connect 改版后无法访问的处理办法
    cocos2d-x 在输入文字时点击语音crash
    Windows下LuaJIT的编译和使用
    多个so中模板单例的多次实例化
    多线程中避免使用信号量
  • 原文地址:https://www.cnblogs.com/xu-xiao/p/6025310.html
Copyright © 2011-2022 走看看