:求一个背包装最大货物:一个背包最多装重量为 C = 10 的物品,现有物品数 n = 5,物品的重量跟价值如下,求该怎么装能装到物品价值
w = {2,2,6,5,4} v = {6,3,5,4,6}
w v 1 2 3 4 5 6 7 8 9 10 1 2 6 0 6 6 9 9 12 12 15 15 15 2 2 3 0 3 3 6 6 9 9 9 10 11 3 6 5 0 0 0 6 6 6 6 6 10 11 4 5 4 0 0 0 6 6 6 6 6 10 10 5 4 6 0 0 0 6 6 6 6 6 6 6
public class beibao1 {
/**
* @param args
*/
// 计算m 数组的值,从下到上计算。
public static void init(int[] w, int[] v, int c, int n, int[][] m){
for(int j = 1; j <= c; j++){
if(w[n-1] > j){
m[n-1][j-1] = 0;
}else{
m[n-1][j-1] = v[n-1];
}
}
for(int i = n-2; i >= 0; i--){
for(int j = 1; j <= c; j++){
if(j < w[i]){
m[i][j-1] = m[i+1][j-1];
}
else{
if( j == w[i])
m[i][j-1] = v[i] > m[i+1][j-1] ? v[i] : m[i+1][j-1];
else
m[i][j-1] = m[i+1][j-1] > m[i+1][j-w[i]-1] + v[i] ? m[i+1][j-1] : m[i+1][j-w[i]-1]+v[i];
}
}
}
}
// 查看背包中最后装入了那几个货物。
public static void answer(int[][] m, int[] w, int[] x, int n, int c){
int j = 10 - 1;
int i;
for(i = 0; i < n-1; i++){
if(m[i][j] == m[i+1][j])
x[i] = 0;
else{
x[i] = 1;
j = (j-w[i]);
}
}
x[n-1] = (m[i][j] != 0) ? 1 : 0;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] w = {2,2,6,5,4};
int[] v = {6,3,5,4,6};
int c = 10;
int n = 5;
int[] x = new int[n];
int[][] m = new int[5][10];
init(w, v, c, n, m);
for(int i = 0; i < n; i++){
for(int j = 0; j < c; j++)
{
System.out.print(m[i][j] + " ");
}
System.out.println();
}
answer(m, w, x, n, c);
for(int i = 0; i < n; i++){
System.out.print(x[i]);
}
}
}