背包问题学习笔记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