`
tudusi
  • 浏览: 1085449 次
文章分类
社区版块
存档分类
最新评论

深入浅出之背包算法——动态规划是如何打败递归的?

 
阅读更多

背包问题(Knapsackproblem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。这个问题涉及到了两个条件:一是物品总的大小小于或等于背包的大小,二是物品总的价值要尽量大。

一.采用递归的回溯法

刚开始接触此类问题时,很多人都会想到用回溯法解决,也就是用递归,这是最直接的方法,同八皇后、迷宫、组合、全排列、贪吃蛇等问题一样,下面给我本人开始用递归写出的算法:

基本原理很简单:求出满足总量的所有组合,再找出总价值最大的那个组合!

递归算法虽然方便,但是所需时间复杂度很高。该算法的时间复杂度为O(n2^n)


二.动态规划


动态规划方法建立在最优原则的基础上,是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些

结果减轻运算量。


如果我们用子问题定义状态来描述的话可以这样解释

f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。用公式表示:


f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}


具体的解释可以理解为将前i件物品放入容量为v的背包中,只考虑第i件物品的策略(放或不放),那么就可以转化为一个只涉及前i-1件物品和第i件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。v表示背包的最大容量,c[i]表示第i件物品的大小,w[i]表示第i件物品的价值)




分享到:
评论

相关推荐

    数据结构与算法——C++版(第3版)源文件

    在《数据结构与算法——C++版(第3版)》中,作者深入浅出地介绍了这些核心概念,并提供了源代码以供学习和实践。 本书可能涵盖了以下几个重要的知识领域: 1. **基础数据结构**:首先,书中会介绍基本的数据结构,...

    算法教程——编程必备知识

    本教程深入浅出地介绍了各种算法,涵盖了从基础到高级的各种主题,使读者能够逐步提升自己的编程能力。 首先,本书会讲解算法的基本概念,包括算法的定义、特性以及评价标准。读者将了解到什么是时间复杂度和空间...

    动态规划算法.

    动态规划是一种在数学和计算机科学领域广泛使用的算法设计技术,主要应用于解决那些可以通过...在学习动态规划时,推荐阅读如《Introduction to Algorithms》等经典教材,它们深入浅出地介绍了动态规划的理论和实践。

    数据结构与算法分析——C语言描述

    《数据结构与算法分析——C语言描述》是数据结构领域的一部经典著作,它深入浅出地介绍了数据结构和算法的基础知识,对于初学者来说,是极好的学习资源。本书的核心在于通过C语言来阐述各种数据结构的实现原理和算法...

    MIT算法导论——算法顶尖经典教材

    这本书深入浅出地介绍了算法的设计、分析和实现,是入门者和进阶者提升算法能力的重要资源。 在算法的世界里,理解和掌握基本概念是至关重要的。书中的知识点涵盖了排序、搜索、图算法、动态规划、分治策略等核心...

    《数据结构算法——Visual C++ 6.0程序集》电子教案

    这份教程通过PPT的形式,深入浅出地讲解了数据结构的基础理论以及实际应用,为学习者提供了丰富的练习程序,以增强对概念的理解和实践能力。 数据结构是计算机科学中的核心概念,它涉及到如何在计算机内存中有效地...

    算法设计课件(东南大学)

    本课程的内部课件深入浅出地讲解了递归与分治策略、分支限界法、动态规划以及贪心算法等关键概念,这些都是计算机科学与信息技术领域不可或缺的基础知识。 一、递归与分治策略 递归是编程中的一个重要概念,它通过...

    算法设计与分析——清华大学王晓东

    《算法设计与分析》是清华大学计算机科学领域著名教授王晓东所著的一本经典教材,它深入浅出地探讨了算法的设计、分析以及实现方法。在IT行业中,算法设计与分析是计算机科学的基础,也是解决复杂问题的关键技能。...

    漫画:动态规划系列(2021.01.22).pdf

    本文旨在通过漫画形式,为读者深入浅出地介绍动态规划的核心思想、分类、优势与不足以及在实践中的应用。 首先,动态规划方法的核心在于将大问题拆分为若干个子问题,通过递归的方式逐个解决这些子问题,并保存子...

    妙趣横生的算法pdf

    《妙趣横生的算法》是一本深入浅出地探讨算法的书籍,旨在通过生动有趣的方式,让读者理解和掌握各种核心算法。算法是计算机科学的灵魂,对于任何IT专业人士来说,理解并能熟练运用算法都是至关重要的。这本书的描述...

    算法导论的教学配套ppt——中科大

    这门课程的配套PPT深入浅出地讲解了算法的基础理论、分析方法以及实际应用,是学习算法的重要参考资料。以下是对这门课程中可能涉及的一些核心知识点的详细解析: 1. **算法基础**:算法是解决问题的精确步骤序列,...

    《计算机算法设计与分析》算法实现题2-1

    《计算机算法设计与分析》是计算机科学领域的一本经典教材,由王晓东编著,它深入浅出地讲解了算法的设计、分析以及其实现方法。这本书对于理解和掌握计算机科学的核心——算法,具有极其重要的意义。算法是解决问题...

    数据结构算法与应用——C++语言描述(中、英)

    本书《数据结构算法与应用——C++语言描述》深入浅出地介绍了这些关键概念,不仅涵盖了理论知识,还提供了实际的C++代码实现,帮助读者更好地理解并应用所学。 在数据结构方面,本书可能涉及以下主题: 1. **线性...

    计算算法与设计 电子书及课后习题答案

    《计算机算法设计与分析》是计算机科学领域的一本经典教材,由王晓东教授编写,它深入浅出地讲解了算法的设计、分析以及实现方法。这本书不仅涵盖了基础的算法理论,还提供了丰富的实例来帮助读者理解和掌握这些算法...

    代码随想录算法PDF.rar

    《代码随想录》是一本深受程序员喜爱的算法学习书籍,尤其对于初学者来说,它提供了深入浅出的讲解和实战演练。这本书的核心是通过实际编程来帮助读者理解和掌握算法,提升编程技能,特别是C++语言的应用。在C++这个...

    常用算法设计方法 比较详细的算法

    这份文档深入浅出地讲解了这些算法的设计思想、实现步骤和时间空间复杂度分析,对于初学者和经验丰富的开发者都是宝贵的资源。掌握这些算法设计方法,有助于提升编程能力,解决实际问题,并在面试和项目开发中展现出...

    结构之法算法之道blog最新博文集锦第6期CHM文件

    《结构之法算法之道》是一本深受IT从业者和学习者喜爱的博客文集,它深入浅出地探讨了计算机科学中的核心概念——数据结构与算法。第6期的博文集锦,以CHM(Compiled HTML Help)文件的形式呈现,这是一种微软开发的...

    麻省理工算法导论

    《麻省理工算法导论》是一本深入浅出地介绍算法理论与实践的教材,源自世界顶级学府——麻省理工学院(MIT)。这门课程旨在帮助计算机专业人员以及对算法有浓厚兴趣的学习者掌握核心的算法知识,提升解决实际问题的...

    算法分析ppt

    《算法分析——深入理解贪心、分治与动态规划》这一PPT资料集的发布,旨在为初学者和专业人士提供一个深入浅出的学习平台,让算法分析变得容易上手,使学习者能够迅速掌握贪心法、分而治之法以及动态规划这三种算法...

    麻省理工学院算法导论课件翻译

    MIT的算法导论课程深入浅出地介绍了算法设计、分析和实现的方法,包括排序、搜索、图算法、动态规划等主题。通过学习这些内容,我们可以掌握如何高效地处理数据,提高程序运行效率,为实际问题找到最优解决方案。 ...

Global site tag (gtag.js) - Google Analytics