http://www.cnblogs.com/hustcat/archive/2010/05/21/1741228.html

动态规划算法是一种经典的算法,它是如此美妙的算法,值得每一个程序员拥有。但是,直到晚上看《算法导论》,才发现自己现在才全面理解它,不禁狂汗。。。

以经典的背包问题来展示动态规划算法

代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  1 #include <stdio.h>#define N    4#define W    5//物品的重量int w[] = {-1, 2, 1, 3, 2};//价值数组int vi[] = {-1, 12, 10, 20, 15};int v[N+1][W+1]; //v[i][j]表示从前i个物品选能够放进承重量为j的背包的子集的最大总价值void init(){int  i, j;for (i = 0; i <= N; i++)for (j = 0; j <= W; j++)v[i][j] = -1;for (i = 0; i <= N; i++)v[i][0] = 0;for (i=0; i <= W; i++)v[0][i] = 0;}//基于备忘录的动态规划算法int MKFnapsack_MEMOIZE(int i, int j){int value;if (v[i][j] < 0)  //如果v[i][j]还没有计算,则进行计算{if (j < w[i])value = MKFnapsack_MEMOIZE(i-1,j);else{int v1 = MKFnapsack_MEMOIZE(i-1, j);int v2 = MKFnapsack_MEMOIZE(i-1, j-w[i]) + vi[i];value = v1 >=v2 ? v1:v2;}v[i][j] = value;}return v[i][j]; //如果v[i][j]已经进行计算,则不进行计算,直接返回即可}//自顶向下的动态规划算法int MKFnapsack_TOP_TO_BOTTOM(int i, int j){int value;if(i <= 0 || j <= 0)return 0;//不管v[i][j]是否计算过,都进行计算if (j < w[i])value = MKFnapsack_TOP_TO_BOTTOM(i-1, j);else{int v1 = MKFnapsack_TOP_TO_BOTTOM(i-1, j);int v2 = MKFnapsack_TOP_TO_BOTTOM(i-1, j-w[i]) + vi[i];value = v1 >= v2 ? v1:v2;}return value;}//自底向上的算法int MKFnapsack_BOTTOM_TO_TOP(int Ni, int Wi){int i, j;for (i = 1; i <= Ni; i++){for(j = 1; j <= Wi; j++){if(j < w[i])v[i][j] = v[i-1][j];else //j >=w[i]{int v1= v[i-1][j];int v2 = v[i-1][j-w[i]] + vi[i];v[i][j] = v1 >= v2 ? v1:v2;}}}return v[N][W];}void print_v(int Ni, int Wi){int i, j;for(i = 0; i <= Ni; i++){for(j = 0; j <= Wi; j++)printf("%d ", v[i][j]);printf("\n");}}int main(){printf("top to bottom most value is:%d\n", MKFnapsack_TOP_TO_BOTTOM(N, W));init();//数组初始化printf("memoize most value is:%d\n", MKFnapsack_MEMOIZE(N, W));print_v(N, W);init();printf("bottom to top most value is:%d\n", MKFnapsack_BOTTOM_TO_TOP(N, W));print_v(N, W);return 0;}

输出结果:

自顶向下的递归算法,写法最简单,但效率是最低的,它往往把问题搞成指数级。而自底向上的算法是DP的经典策略,它比自顶向下的效率高,但是,它往往也计算了没有必要计算的子问题(见上图)。而基于备忘录的自顶向下的算法是前两者的集大成者,效率最优。

动态规划 01背包问题相关推荐

  1. 动态规划—01背包问题

    原文作者:弗兰克的猫 原文地址:[动态规划]01背包问题 摘要: 01背包问题:n个物品放入容量为c的背包中. 常见解法: 分治法:递归计算,且存在重复计算的bug 自上而下填表法:从大到小使用递归计 ...

  2. 动态规划——0-1背包问题

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 0-1背包问题 背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示.怎么放才 ...

  3. 动态规划——01背包问题 看此一篇文章就够了

    本文讲述经典算法--动态规划的 常见问题 01背包  一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...

  4. 动态规划---01背包问题(2种方法)

    一.动态规划 代表一类问题(最优子结构或子问题最优性)的一般解法,是设计方法或者策略,不是具体算法 本质:递推,核心是找到状态转移的方式,写出dp方程. 解决问题:交叉,重叠子问题(最优子问题) 形式 ...

  5. 动态规划01背包问题入门学习,详细笔记,推荐阅读

    问题描述: 给定N种物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?? 在选择物品的时候,对每种物品i只有两种选择, ...

  6. python实现动态规划0-1背包问题

    一.动态规划算法介绍 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待 ...

  7. 详解动态规划01背包问题--JavaScript实现

    对其他动态规划问题感兴趣的,也可以查看 详解动态规划最少硬币找零问题--JavaScript实现 详解动态规划最长公共子序列--JavaScript实现 一开始在接触动态规划的时候,可能会云里雾里,似 ...

  8. 动态规划--01背包问题详解

    代码随想录day42和day43 动态规划 模块01背包问题 "即使到不了远方,心中也要有远方的模样." 文章目录 1. 01背包理论基础 1.1什么是背包问题 1.2二维dp数组 ...

  9. 1.动态规划--01背包问题

    动态规划 DP问题思考时候分成两大部分考虑 1. 状态表示 f(i,j) (1) 集合:(所有选法的集合) 所有选法 条件: 1.从前i个物品中选 2. 总体积m<=j (2) 属性 最大值.最 ...

  10. 动态规划-01背包问题

    大佬整理的理解链接:(建议先看一遍自行理解DP思想再去看代码) 动态规划之01背包问题 - kkbill - 博客园01背包问题 问题描述: 给定 n 件物品,物品的重量为 w[i],物品的价值为 c ...

最新文章

  1. WMI技术介绍和应用——查询正在运行的线程信息
  2. 普元王葱权:数字化时代需要新一代的大数据应用平台架构
  3. 浅谈我对DDD领域驱动设计的理解
  4. 走进JavaScript响应式编程(Reactive Programming)
  5. SAP GUI是如何启动本地安装的office word应用的
  6. 解决 windows10和ubuntu16.04双系统下时间不对的问题
  7. C语言(CED)多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好。
  8. 数据标准化处理方法_机器学习系列-数据预处理-数据标准化(归一化)-理论
  9. 大数据之-Hadoop3.x_Yarn_基础架构---大数据之hadoop3.x工作笔记0141
  10. mysql 权限信息存储库_springboot-security02FromDB 权限管理(用户信息和角色信息保存在数据库)详解...
  11. bzoj 1603: [Usaco2008 Oct]打谷机(拆点并查集)
  12. Delphi【变体记录及存储方式】
  13. FISCO BCOS Solidity 智能合约 返回多个值
  14. 如何破解qq仅三天可见
  15. jquery weui 显示loading
  16. 梦洁高端化,能解决中国人的睡眠问题吗?
  17. 「网络流 24 题」火星探险问题。
  18. 【技术探索】利用m3u8下载ts并合并成一个完整视频
  19. Java篇 - 最全BigInteger和BigDecimal实战
  20. 崩坏3服务器维护什么时候维护好,崩坏3 11月1日更新了什么_维护到什么时候结束...

热门文章

  1. 台积电偷笑:就算Intel技术牛我也要赶超你
  2. 跨职能流程图_领导跨职能团队的6个关键技巧
  3. 锐捷网络:校园网基于802.1x无感知认证
  4. 绝世舞姬计算机弹音乐,绝世舞姬(伴奏)
  5. 解读CUDA Compiler Driver NVCC - Ch.4
  6. 服务器之间的无线通讯,无线通讯技术之间的比较 - 常见无线通信(数据)传输技术 你知道哪些...
  7. 内网渗透思路10之SPN拿下域控
  8. Java向上转型 向下转型
  9. 固定定位的盒子使用margin:0 auto;是无法水平居中的,此时该怎么操作呢?
  10. Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)