黑马程序员_0-1背包问题的解决算法

来源:互联网 发布:mysql主从复制读写分离 编辑:程序博客网 时间:2024/04/28 03:49

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

问题描述:给定n种物品和一个背包,物品i的重量是w,其价值是VI,背包容量是C。问:如何选取物品装入背包,使得背包中物品的总价值最大。

m[n][j]表示背包的重量是j,x[] 表示状态标志。

算法设计如下:

public static void Knapsack(int[]v,int[]w,int c,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>1;i--){
jMax=Math.min(w[i]-1,c);
for(int j=0;j<=jMax;j++)
m[i][j]=m[i][j+1];
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]);
}


m[1][c]=m[2][c];
if(c>=w[1])
m[1][c]=Math.max(m[1][c],m[2][c-w[1]+v[1]]);
}
public static void traceback(int[][]m,int[]w,int c,int []x){
int n = w.length-1;
for(int i=1;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;
}

按照上述算法knapsack计算后,m[1][c]给出所要求的0-1背包问题的最优解。相应的最优解可由算法traceback计算如下:

如果m[1][c]=m[2][c],则x1=0;否则想=1.当x1=0时,由于m[2][c]继续构造最优解;当x1=1;由m[2][c-w1]继续构造最优解。以此类推,可以构造最终的最优解。

                             ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

详情请查看:http://edu.csdn.net/heima

0 0