动态规划之背包问题

例题

现有4样物品n = ['a', 'b', 'c', 'd'],重量分别为w = [2, 4, 5, 3],价值分别为v = [5, 4, 6, 2]。背包最大承重c = 9。

现求背包可以装下的最大价值。

解答

对于动态规划的三个关键要素:

  1. 边界。F(i, 0) = F(0, j) = 0。其中F(i, 0)代表背包此时没有空间可以容纳物品;F(0, j)代表没有物品可以放入背包。

  2. 最优子结构。F(i ,j)表示在前i个物品中选择,当前背包还可容纳j时的最大价值。

  3. 状态转移函数。

分两种情况:对于第i件物品,若此时背包没有空间可容纳可以容纳,即w[i-1]>j,此时F(i ,j) = F(i-1, j);

若背包有能力承受第i件物品,即w[i-1]<=j,说明此时背包可以选择装入第i件物品,那么F(i, j) = F(i-1, j-w[i-1]) + v[i-1];若背包不装入该物品,则F(i, j) = F(i-1, j)。故此时F(i, j) = max{F(i-1, j-w[i-1]) + v[i-1], F(i-1, j}。

代码

def dpsack(n, c, w, v):
recordMap = [[0 for i in range(c+1)] for i in range(len(n)+1)] for i in range(1, len(n)+1):
for j in range(1, c+1):
if j < w[i-1]:
recordMap[i][j] = recordMap[i-1][j]
# 背包无法容纳第i件物品的时候
else:
recordMap[i][j] = max(v[i-1]+recordMap[i-1][j-w[i-1]], recordMap[i-1][j])
# 背包可容纳第i件物品的时候,选择价值最大的方式 return recordMap[len(n)][c]
# 输出矩阵右下角的元素,即为最大值。
c = 9
n = ['a', 'b', 'c', 'd']
w = [2, 4, 5, 3]
v = [5, 4, 6, 2] dpsack(n, c, w, v)

运行结果

11

动态规划的总结

  • 在给定约束条件下优化某指标,可使用动态规划
  • 问题可以被分解为离散子问题时,可考虑动态规划
  • 动态规划解决方案一定涉及表格
  • 单元格中的值是需要优化的值
  • 每个单元格都是一个子问题,所以需要考虑如何将问题分解为子问题
  • 没有放之四海皆准的dp解决公式
  • dp三要素:边界;最优子结构;状态转移函数

其他的乱七八糟的事

本来承诺每天至少写一篇博客也鸽了自己好几天
最近的焦头烂额状态萎靡
唯一的娱乐除了收能量就是刷实习僧牛客网
bst这块也一直拖
本来dp想和最长递增序列一起写个综述,结果打死也学不会LIS,今天就放弃了叭
人生难的我想就地躺平
不抱怨了,自己选的路唉

[Dynamic Programming]动态规划之背包问题的更多相关文章

  1. Dynamic Programming 动态规划入门笔记

    算法导论笔记 programming 指的是一种表格法,并非编写计算机程序 动态规划与分治方法相似,都是通过组合子问题的解来求解原问题.但是分治法将问题划分为互不相交的子问题.而动态规划是应用与子问题 ...

  2. 理解dynamic programming动态规划

    何谓动态规划? 以菲波那切数列为例, int fib(int n ){ if(n == 0 || n ==1){ return 1; }else{ return fib(n - 1) + fib(n ...

  3. Dynamic Programming(动态规划)

    钢材分段问题 #include<iostream> #include<vector> using namespace std; class Solution { public: ...

  4. 强化学习三:Dynamic Programming

    1,Introduction 1.1 What is Dynamic Programming? Dynamic:某个问题是由序列化状态组成,状态step-by-step的改变,从而可以step-by- ...

  5. 详解动态规划(Dynamic Programming)& 背包问题

    详解动态规划(Dynamic Programming)& 背包问题 引入 有序号为1~n这n项工作,每项工作在Si时间开始,在Ti时间结束.对于每项工作都可以选择参加与否.如果选择了参与,那么 ...

  6. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  7. 以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

    动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划 ...

  8. 最优化问题 Optimization Problems & 动态规划 Dynamic Programming

    2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题( ...

  9. 对动态规划(Dynamic Programming)的理解:从穷举开始(转)

    转自:http://janfan.cn/chinese/2015/01/21/dynamic-programming.html 动态规划(Dynamic Programming,以下简称dp)是算法设 ...

随机推荐

  1. 谷歌Waymo估值700亿:自动驾驶迎来春天,但前路漫漫

    在经过近一年的法庭之争后,Waymo与Uber的自动驾驶专利权诉讼案于近日宣布和解.最终的结果,是Uber向Waymo支付0.34%股权(目前价值2.44亿美元).但事实上,与Uber的官司解决后,一 ...

  2. A Knight's Journey (DFS)

    题目: Background The knight is getting bored of seeing the same black and white squares again and agai ...

  3. Redis报错Can't save in background: fork: Cannot allocate memory及类似问题的处理方法

    问题的发现及解决过程: 1.Redis主从复制(一主一从)环境在客户端用命令查看主从状态 在slave上输入命令显示如下: 在master上输入命令显示如下: 从显示可以看出主从关系出现问题,然后查看 ...

  4. Keepalived+Haproxy搭建高可用负载均衡

    Keepalived 简单的是一个路由的软件用C写的这个项目的主要目标是提供简单而强大的设施的负载均衡和高可用性对Linux系统和基于Linux的基础设施.负载均衡架构依赖于众所周知的和广泛使用的Li ...

  5. Autotestplat.com 更新了!

    1 提供测试发帖留言功能 2 自动化平台体验功能 3 提供招聘资讯功能       4 提供推荐书籍功能

  6. linux 的uuid码

    在提到这个之前,有个概念,就是什么是uuid呢? UUID码全称是通用唯一识别码 (Universally Unique Identifier, UUID),它 是一个软件建构的标准,亦为自由软件基金 ...

  7. NERDTree快捷键

    切换工作台和目录 ctrl + w + h 光标 focus 左侧树形目录ctrl + w + l 光标 focus 右侧文件显示窗口ctrl + w + w 光标自动在左右侧窗口切换ctrl + w ...

  8. 并查集(不相交集)的Union操作

    在并查集(不相交集)中附加操作\(Deunion\),它实现的功能是取消最后一次\(Union\)的操作. 实现思想 初始化一个空栈,将每一次的\(Union\)操作的两个集合的根和其值\(Push\ ...

  9. 查询mysql版本号

    mysql> select version(); +------------+| version() |+------------+| 5.7.23-log |+------------+1 r ...

  10. Canvas 使用及应用

    Canvas canvas 是 HTML5 当中我最喜欢的所有新特性中我最喜欢的一个标签了.因为它太强大了,各种有意思的特效都可以实现. 1. canvas 的基本使用方法 - 它是一个行内块元素 - ...