动态规划 01背包问题
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背包问题相关推荐
- 动态规划—01背包问题
原文作者:弗兰克的猫 原文地址:[动态规划]01背包问题 摘要: 01背包问题:n个物品放入容量为c的背包中. 常见解法: 分治法:递归计算,且存在重复计算的bug 自上而下填表法:从大到小使用递归计 ...
- 动态规划——0-1背包问题
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 0-1背包问题 背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示.怎么放才 ...
- 动态规划——01背包问题 看此一篇文章就够了
本文讲述经典算法--动态规划的 常见问题 01背包 一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...
- 动态规划---01背包问题(2种方法)
一.动态规划 代表一类问题(最优子结构或子问题最优性)的一般解法,是设计方法或者策略,不是具体算法 本质:递推,核心是找到状态转移的方式,写出dp方程. 解决问题:交叉,重叠子问题(最优子问题) 形式 ...
- 动态规划01背包问题入门学习,详细笔记,推荐阅读
问题描述: 给定N种物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?? 在选择物品的时候,对每种物品i只有两种选择, ...
- python实现动态规划0-1背包问题
一.动态规划算法介绍 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待 ...
- 详解动态规划01背包问题--JavaScript实现
对其他动态规划问题感兴趣的,也可以查看 详解动态规划最少硬币找零问题--JavaScript实现 详解动态规划最长公共子序列--JavaScript实现 一开始在接触动态规划的时候,可能会云里雾里,似 ...
- 动态规划--01背包问题详解
代码随想录day42和day43 动态规划 模块01背包问题 "即使到不了远方,心中也要有远方的模样." 文章目录 1. 01背包理论基础 1.1什么是背包问题 1.2二维dp数组 ...
- 1.动态规划--01背包问题
动态规划 DP问题思考时候分成两大部分考虑 1. 状态表示 f(i,j) (1) 集合:(所有选法的集合) 所有选法 条件: 1.从前i个物品中选 2. 总体积m<=j (2) 属性 最大值.最 ...
- 动态规划-01背包问题
大佬整理的理解链接:(建议先看一遍自行理解DP思想再去看代码) 动态规划之01背包问题 - kkbill - 博客园01背包问题 问题描述: 给定 n 件物品,物品的重量为 w[i],物品的价值为 c ...
最新文章
- WMI技术介绍和应用——查询正在运行的线程信息
- 普元王葱权:数字化时代需要新一代的大数据应用平台架构
- 浅谈我对DDD领域驱动设计的理解
- 走进JavaScript响应式编程(Reactive Programming)
- SAP GUI是如何启动本地安装的office word应用的
- 解决 windows10和ubuntu16.04双系统下时间不对的问题
- C语言(CED)多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好。
- 数据标准化处理方法_机器学习系列-数据预处理-数据标准化(归一化)-理论
- 大数据之-Hadoop3.x_Yarn_基础架构---大数据之hadoop3.x工作笔记0141
- mysql 权限信息存储库_springboot-security02FromDB 权限管理(用户信息和角色信息保存在数据库)详解...
- bzoj 1603: [Usaco2008 Oct]打谷机(拆点并查集)
- Delphi【变体记录及存储方式】
- FISCO BCOS Solidity 智能合约 返回多个值
- 如何破解qq仅三天可见
- jquery weui 显示loading
- 梦洁高端化,能解决中国人的睡眠问题吗?
- 「网络流 24 题」火星探险问题。
- 【技术探索】利用m3u8下载ts并合并成一个完整视频
- Java篇 - 最全BigInteger和BigDecimal实战
- 崩坏3服务器维护什么时候维护好,崩坏3 11月1日更新了什么_维护到什么时候结束...
热门文章
- 台积电偷笑:就算Intel技术牛我也要赶超你
- 跨职能流程图_领导跨职能团队的6个关键技巧
- 锐捷网络:校园网基于802.1x无感知认证
- 绝世舞姬计算机弹音乐,绝世舞姬(伴奏)
- 解读CUDA Compiler Driver NVCC - Ch.4
- 服务器之间的无线通讯,无线通讯技术之间的比较 - 常见无线通信(数据)传输技术 你知道哪些...
- 内网渗透思路10之SPN拿下域控
- Java向上转型 向下转型
- 固定定位的盒子使用margin:0 auto;是无法水平居中的,此时该怎么操作呢?
- Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)