学习动态规划的时候遇到的多重背包问题,没看懂,便从最简单的01背包开始记录自己的领悟。
什么是01背包问题
有一个背包,容量大小为一个已知数(V)。想要用这个背包来装已知的若干个(n)不同的物体,每个物体都有一个已知的大小(w)和一个已知的价值(v)。每一个物体只能装一个。求此背包在装哪几个物体的时候价值能达到最大值。
因为每个物体都只有装(1)和不装(0)两种状态,因此该问题被称为01背包。
01背包问题如何计算
代码如下,v为该若干个物品的价值数组,w为该若干个物品的大小数组。
private static int bestValue(int[] v,int[] w,int V){
int n = v.length;
int [][] f = new int[V+1][n+1];//创建矩阵,横坐标为V+1为容量,纵坐标为n+1为物品占地,坐标内容为价值最高的放法
//填充边界行与列,在此问题中,行与列都为0
for (int i = 0; i < n; i++) {
f[0][i]=0;
}
for (int i = 0; i < V; i++) {
f[i][0]=0;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= V; j++) {
if(j < w[i-1]){//如果背包容量小于物品占地,则取上一个最大价值
f[j][i] = f[j][i-1];
}else {//若大于,则计算放入和不放入的最大值为当前最大值
f[j][i] = Math.max(f[j][i-1],f[j-w[i-1]][i-1]+v[i-1]);
}
}
}
return f[V][n];
}
步骤为:
建立一个二维数组int [][] f ,横坐标为背包容量V,纵坐标为物品个数n&#x