揹包問題學習筆記java
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