黑马程序员_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学习型技术博客、期待与您交流! ------------
详情请查看:
- 黑马程序员_0-1背包问题的解决算法
- 动态规划_0-1背包问题
- 黑马程序员--C语言算法之01背包问题
- 模拟退火算法解决0-1背包问题的实现
- 回溯法_0/1背包问题(非递归)
- 贪心算法解决0 1背包问题
- 遗传算法解决0-1背包问题
- Java解决算法-背包问题
- 贪心算法解决背包问题
- 贪婪算法解决背包问题
- 贪心算法解决背包问题
- 遗传算法解决背包问题
- 贪心算法解决背包问题
- 贪婪算法解决背包问题
- 遗传算法解决背包问题
- 黑马程序员_0基础黑马路
- Deap : 遗传算法算法解决 背包问题
- 背包问题的算法
- 分蛋糕
- ios iPhone的 自带输入法emoji编程
- Triangle
- meta标记用于定义文件信息
- jrtplib example3程序问题
- 黑马程序员_0-1背包问题的解决算法
- 解决 Iframe跨域session 丢失问题
- VirtualBox如何共享文件夹
- android获取资源文件R.drawable中的图片的相关方法
- 正则表达式基本语法
- 网址
- MyEclipse代码格式化
- 士的罚款
- js 执行CMD 命令的方法