算法——“背包问题” Java代码实现
/**
* 背包问题代码实现
*/
public class Knapsack {
static int[] w = {2,2,6,5,4};//每件物品的重量
static int[] v = {6,3,5,4,6};//每件物品的价值
static int c = 10;
public static void knapSack(int[] w,int[] v,int[][] m) {
int n = v.length-1;
int jMax = Math.min(w[n] -1,c);
for (int j = 0; j <= jMax; j++) {
m[n][j] = 0;
}
for (int j = w[n]; j <= c ; j++) {
m[n][j] = v[n];
}
for (int i = n -1; i >= 0; i--) {
jMax = Math.min(w[i] - 1,c);
for (int j = 0; j <= jMax; j++) {
m[i][j] = m[i + 1][j];
}
for (int j = w[i]; j <= c; j++) {
m[i][j] = Math.max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);
}
}
}
public static void traceback(int w[], int m[][], int x[]){
int n = v.length - 1;
for (int i = 0; i < n; i++) {
if (m[i][c] == m[i + 1][c]){
x[i] = 0;
}else {
x[i] = 1;
c -= w[i];
}
}
x[n] = (m[n][c]>0) ? 1:0;
System.out.print("x=");
for (int i = 0; i <= n; i++) {
System.out.print(x[i] + ",");
}
System.out.println();
}
public static void main(String args[]) {
int m[][] = new int[v.length][c+1];
System.out.println("当前物品,价值和背包容量下,优先函数m[][]的结果为:");
knapSack(w,v,m);
for (int i = 0; i <= c; i++) {
System.out.print("-------");
}
System.out.println();
for (int i = 0; i < v.length; i++) {
for (int j = 0; j <= c; j++) {
System.out.printf("%6d", m[i][j]);
}
System.out.println();
}
System.out.println("背包能装的最大价值为:"+m[0][c]);
for (int i = 0; i <= c; i++) {
System.out.print("-------");
}
System.out.println();
System.out.println("前物品,价值和背包容量下,最溶解是:");
int x[] = new int[v.length];
traceback(w,m,x);
System.out.println("---------------------------------------------------------");
}
}
执行结果