动态规划-背包问题
背包问题学习笔记
背包的状态转换方程 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