DP 0-1背包问题
来源:互联网 发布:淘宝商家贷款条件 编辑:程序博客网 时间:2024/05/29 19:46
问题描述:
给定n种物品和一背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。
问:该如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包中多次,也不能只装入部分的物品i。因此该问题称为0-1背包问题。
问题分析:
此问题可以使用搜索算法以及贪心算法等,在此使用动态规划算法。
1.最优子结构性质
设(y1,y2,....yn)是所给0-1背包问题的一个最优解,则(y2,y3.....yn)是下面相应子问题的一个最优解。
设所给0-1背包问题的子问题
其最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,....,n时0-1背包问题的最优值。
计算m(i,j)的递归式如下:
3.算法描述
按递归关系计算出的最优值算法如下:
import java.util.Math;
public static void knapsack(int[]v,int[]w,int c,int[][]m)
{
int n=v.length-1; //int n=w.length-1
int jMax=Math.min(w[n]-1,c); //将递归式变为代码
for(int j=0;j<=jmax;j++) //先解决子问题m[n][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); //m[n-1][j]=m[n][j]
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]);//选择加入v[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; //m[i][c]==m[i+1][c],表明没有选择物品i
else{x[i]=1;
c-=w[i];}
x[n]=(m[n][c]>0)?1:0;
}
总结:
1.还是要注意各种变量的解设,即最优值的解设方法。最优值,以及记录产生最优值时的条件等。
2.写递归式是,最小子问题不要漏掉。然后由最小子问题去求次小子问题。
- 0-1背包问题 | DP
- 0/1 背包 dp问题
- DP 0-1背包问题
- 0-1背包问题(DP)
- 简单背包问题+0/1背包问题+DP
- 0—1背包问题(dp)
- 入门经典 DP 0-1背包问题
- 0-1背包(DP经典问题)
- 0-1背包 (DP)
- DP 背包问题 01背包
- DP入门, 0-1背包问题(HDOJ 2602类似)
- 0-1背包问题(C++ && 详解)DP
- poj 3624 Charm Bracelet DP 0/1 背包问题
- UVa 624 - CD DP 0/1 背包问题
- 算法导论-----------------0-1背包问题dp求解
- Tyvj P1005 采药 - DP 0/1背包问题
- 0-1背包问题(电子科大饭卡)dp
- 洛谷P1049 装箱问题(DP, 0-1背包)
- 找零钱问题中动态优化的空间复杂度优化
- margin:auto 与 margin:0 auto 区别
- c++:指向学生类的指针:求最高成绩
- 转载PHP数组浅析
- iOS js oc相互调用(JavaScriptCore)(二)
- DP 0-1背包问题
- [LeetCode]problem 114. Flatten Binary Tree to Linked List
- WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping
- 多态概念
- MyBatis-环境配置以及查询
- 【c++程序】句子逆序
- 关于悲观锁和乐观锁
- CodeIgniter学习笔记 Item6--CI中的常规主题
- 消息转换器HttpMessageConverter