动态规划算法,背包问题

来源:互联网 发布:mac版的visual studio 编辑:程序博客网 时间:2024/05/21 06:32

什么是动态规划算法?

从终点向始点求最大(小)值


-----------------------------------------------

例子分析:

1、完全背包问题

2、0-1背包问题

-----------------------------------------------

完全背包问题

有一个徒步旅行者,其可携带物品重量的限度为a 公斤,设有n 种物品可供他选择装入包中。已知每种物品的重量及使用价值(作用),问此人应如何选择携带的物品(各几件),使所起作用(使用价值)最大?



==========================分页线===============================

k=1 时,   f1(y) =c1x1         (因为只装1种物品) 

当1<kn 时,其递推关系如下:

  设:akxk为装有第k件物品的重量(其中 0≤akxk≤ y ),此时还剩y -akxk(公斤)空间,需要装前k-1 种物品,如果采取最优策略,则得到的最大价值为fk-1(y - akxk) ,因此总的价值为:
                             ckxk +fk-1(y - akxk)  

==========================分页线===============================



==========================分页线===============================


==========================分页线===============================


==========================分页线===============================


==========================分页线===============================


==========================分页线===============================


==========================分页线===============================


==========================分页线===============================


贴源码前再回顾下公式:

贴源码(递归方式):

// 动态价值表,每一项对应包当前所能装入的最优值VT[n+1][a+1] = {0};// a[k] 指第k件物品的重量// c[k]<span style="white-space:pre"></span>指第k件物品的价值int RecursionBag(int k, int y)<span style="white-space:pre"></span>//<span style="white-space:pre"></span>资源数,包容量{<span style="white-space:pre"></span>if(k == 0 || y == 0)<span style="white-space:pre"></span>return 0;<span style="white-space:pre"></span>if(k == 1)<span style="white-space:pre"></span>return c[1]*(y/a[1]);<span style="white-space:pre"></span>if(VT[k][y] != 0)<span style="white-space:pre"></span>return VT[k][y];<span style="white-space:pre"></span>if(y >= a[k])<span style="white-space:pre"></span>{<span style="white-space:pre"></span>VT[k][y] = max(c[k]*x[k] + RecursionBag(k-1, y-a[k]*x[k])); // 0 <= x[k] <= y/a[k],此处伪代码<span style="white-space:pre"></span>}<span style="white-space:pre"></span>else<span style="white-space:pre"></span>{<span style="white-space:pre"></span>VT[k][y] = RecursionBag(k-1, y);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return VT[k][y];}

0-1背包问题:

0-1背包是完全背包的一种特殊形式,完全背包没件物品数量可以取

0,1,2,3...n,而0-1背包物品数量只能去0,1。

所以,0-1背包问题照样用完全背包方式求解,只是在

VT[k][y] = max(c[k]*x[k] + RecursionBag(k-1, y-a[k]*x[k]));
这一步
// 0 <= x[k] <= y/a[k]
改为

// 0 <= x[k] <= 1



0 0
原创粉丝点击