动态规划问题一:背包问题
2018-11-29 21:40
134 查看
学习自:Christal_R
有一个背包,能盛放的物品总重量为capacity,设有number件物品,其重量分别为w1,w2,…,wn,希看从N件物品中选择若干物品,所选物品的重量之和恰能放进该背包,即所选物品的重量之和即是S。
寻找递推关系式,面对当前商品有两种可能性:
第一,包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
第二,还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{ V(i-1,j),V(i-1,j-w(i))+v(i) },其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i)但价值增加了v(i);
由此可以得出递推关系式:
- j<w(i) V(i,j)=V(i-1,j)
- j>=w(i) V(i,j)=max{ V(i-1,j),V(i-1,j-w(i))+v(i) }
void FindMax()//动态规划 { int i,j; //填表 for(i=1;i<=number;i++) { for(j=1;j<=capacity;j++) { if(j<w[i])//包装不进 { V[i][j]=V[i-1][j]; } else//能装 { if(V[i-1][j]>V[i-1][j-w[i]]+v[i])//不装价值大 { V[i][j]=V[i-1][j]; } else//前i-1个物品的最优解与第i个物品的价值之和更大 { V[i][j]=V[i-1][j-w[i]]+v[i]; } } } } }
表格填完,最优解即是V(number,capacity)=V(4,8)=10,但还不知道解由哪些商品组成,故要根据最优解回溯找出解的组成,根据填表的原理可以有如下的寻解方式:
- V(i,j)=V(i-1,j)时,说明没有选择第i 个商品,则回到V(i-1,j);
- V(i,j)=V(i-1,j-w(i))+v(i)实时,说明装了第i个商品,该商品是最优解组成一部分,随后我们得回到装该商品之前,即回到V(i-1,j-w(i));
- 一直遍历到i=0结束为止,所有解的组成都会找到。
void FindWhat(int i,int j)//寻找解的组成方式 { if(i>=0) { if(V[i][j]==V[i-1][j])//相等说明没装 { item[i]=0;//全局变量,标记未被选中 FindWhat(i-1,j); } else if( j-w[i]>=0 && V[i][j]==V[i-1][j-w[i]]+v[i] ) { item[i]=1;//标记已被选中 FindWhat(i-1,j-w[i]);//回到装包之前的位置 } } }阅读更多
相关文章推荐
- 常见动态规划例子(双调欧几里得旅行商问题、0-1背包问题等)
- 动态规划0-1背包问题
- 【USACO3.1.2】总分 背包问题动态规划
- ACM:动态规划,物品无限的背包问题(完全背包问题)
- 【算法】——动态规划之0-1背包问题
- 0-1背包问题与动态规划的C/C++代码
- 动态规划解背包问题/C++/Knapsack problem
- 动态规划:0/1背包问题
- 动态规划:HDU2159-FATE(二维费用的背包问题)
- 动态规划之0-1背包问题
- 动态规划——背包问题变形
- 动态规划,背包问题变型
- 完全背包问题动态规划c++
- 动态规划之背包问题
- 动态规划之背包问题
- 动态规划之0-1背包问题,钢条切割
- 动态规划之背包问题
- 动态规划解决0-1背包问题
- 动态规划 之 0-1背包问题
- 动态规划背包问题