動態規劃-揹包問題

揹包問題學習筆記java

揹包的狀態轉換方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] }

i:表示物品序號數組

j:表示揹包大小學習

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

f[i,j]:表示在前i件物品中選擇若干件放在承重爲 j 的揹包中,能夠取得的最大價值spa

f[i-1,j-Wi]:表示在前i-1件物品中選擇若干件放在承重爲j-Wi的揹包中,能夠取得的最大價值.net

Pi(j>=Wi):表示第i件物品的價值,要求揹包大小j要大於此件物品的重量code

f[i-1,j]:表示前i-1件物品中選擇若干件放在承重爲j的揹包中,能夠取得的最大價值blog

 

方程的解釋:當前最優 = 以前計算獲得的、當前物品數減1、當前揹包數減去當前物品重量的剩餘容量的最優解  +  當前物品價值(要求當前物品重量大於當前揹包數)class

            與import

            以前計算獲得的、當前物品數減一,揹包數相同的狀況下的最優解

           中較大的數

 

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

相關文章
相關標籤/搜索