数据结构——图 动态规划

本文探讨了动态规划在解决图的最短路径问题中的应用,包括1/0背包问题和Floyd算法。动态规划通过递推公式减少了复杂度,避免了贪婪法和分治法的局限。文章详细解释了1/0背包问题的最优解,并介绍了Floyd算法在有向图中寻找最短路径的动态规划公式,以及其在处理负权重边时的优势。最后,给出了算法的迭代求解和伪代码实现。
摘要由CSDN通过智能技术生成

  动态规划难度相对较大。它的基础是最优原理。有很多问题,用贪婪法或者分而治之无法简洁高效的解决,但是动态规划就可以。

  在动态规划中,我们要考察一系列抉择,以确定一个最优抉择序列是否包含最优抉择子序列。当最优抉择包含最优抉择子序列时,可建立动态规划递归方程以帮助我们高效解决问题。

  动态规划常常基于一个递推式或一个或多个初始状态。当前子问题的解将由上一个子问题的解推出。一般是多项式复杂度。

1.0/1背包问题

  有n个物品和一个容量为c的背包,从n个物品中选取装包的物品。物品i的重量为wi,价值为pi。一个可行的背包装载是指,背包的物品总重量不超过背包的容量。一个最佳的背包装载是物品总价值最高的可行的背包装载。

  问题的公式描述是 maxΣpixi  ; 约束条件是 Σwixi <= c且 xi∈{0,1}.

  1)递归求解,F(1,c)返回f(1,c)的值。

int F(int i, int y)
{//Return f(i,y).
  if(i == n) return (y < w[n]) ? 0 : p[n];
  if(y < w[i]) return F(i+1,y);
  return max(F(i+1,y),F(i+1,y-w[i])+p[i]);
}
  2)迭代计算 f 和 x
template<class T>
void Knapsack(T p[], int w[], int c, int n, T** f){
//Compute f[i][y] for all i and y.
 
 //initialize f[n][]
 for(int y = 0; y < w[n]; y++)
  f[n][y] = 0;
 for(int y = w[n]; y <= c; y++)
  f[n][y] = p[n];

 //compute remaining f's
 for(int i = n - 1; i > 1; i--){
  for(int y = 0; y < w[i]; y++)
   f[i][y] = f[i+1][y];
  for (int y = w[i]; y <=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值