动态规划-背包问题

背包问题学习笔记

背包的状态转换方程 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

posted @ 2016-11-03 11:09  从余  阅读(315)  评论(0编辑  收藏  举报