首先引入动态变化的含义:为什么要有动态规划?

Introduction:

从斐波那契函数的递归中我们发现,在例子求fib(7)的过程中,我们需求得fib(5)和fib(6),而我们在求fib(6)的时候必然需要求fib(5),因此我们会重复进行两遍fib(5)的操作,所以对我们程序的时间和空间都造成巨大浪费,且此程序的时间复杂度高达O(2^n),这是非常可怕的指数型复杂度。所以我们引入了动态规划。如图所示,如果我们对fib(5)等类似以及求过的结果进行存储,那么我们的时间复杂度降至了O(n),极大程度提高了程序的效率。

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。

接下来引入最为著名的动态规划的入门问题:背包问题(knapsack problem):

问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。

首先我们创建一个数组dp[i][w]代表:对前i个物品,当背包的承重为w是,所能装下的物品的最高价格。且我们很容易知道dp[0][...]和dp[...][0]等于0。而这两组数组也是我们进行动态变化的初值。

然后我们要进行判断,首先我们把物品的个数定为确定的值i,然后对w进行不断递增,对于dp[i][w]来说,他的最大值可以进行如下的讨论:

如果我们装下第i个物品,即w的值必须大于该物品的重量,然后我们装下这个物品后,剩余的空间为w-wt[i],我们就假设又拿了一个包,这个包的容量是w-wt[i],且只能装i-1个物品,那么我们就得到了此时的总价值为:该物品i的价值加上承重为w-wt[i]条件下前面i-1个物品的总价值val[i-1]+dp[i-1][w-wt[i]]

如果我们不装下第i个物品,那么我们的目标值就是除去第i个物品的最大值,即dp[i-1][w]

最后我们比较dp[i-1][w]和val[i-1]+dp[i-1][w-wt[i]]的值最大值即为dp[i][w],当w到达最大值后,i++,然后循环往复上述操作,知道dp[N][W]赋值完毕,返回dp[N][W]即可

最后附上Java代码

public class Package {public int knapsack(int W, int N, int[] wt, int[] val) {//W为背包容量,N为物品个数int [][] dp = new int[N+1][W+1];for(int i =1;i<=N;i++) {for(int w = 1;w<=W;w++) {if(w-wt[i-1]<0) {dp[i][w]=dp[i-1][w];}else {dp[i][w] = Math.max(dp[i-1][w-wt[i-1]]+val[i-1], dp[i-1][w]);}}}return dp[N][W];}}

Dynamic Programming 01 —knapsack problem(动态规划背包问题)相关推荐

  1. 动态规划法(四)0-1背包问题(0-1 Knapsack Problem)

      继续讲故事~~   转眼我们的主人公丁丁就要离开自己的家乡,去大城市见世面了.这天晚上,妈妈正在耐心地帮丁丁收拾行李.家里有个最大能承受20kg的袋子,可是妈妈却有很多东西想装袋子里,已知行李的编 ...

  2. 0-1背包问题(0-1 knapsack problem)c++实现

    文章目录 1 问题描述 2 基本原理 3代码实现 1 问题描述 有n个物品,它们有各自的重量和价值,现有一给定最大载重的背包,如何让背包里装入的物品具有最大的价值总和而又不超过最大载重? 比如: 商品 ...

  3. FZU 2214 Knapsack problem(背包问题)

    Description 题目描述 Given a set of n items, each with a weight w[i] and a value v[i], determine a way t ...

  4. dynamic programming for knapsack with repeated items algorithm demonstration

  5. 动态规划背包问题详解(二)---0-1背包问题

    /**  * 对于技术面试,你还在死记硬背么?  * 快来"播"沙糖橘吧,  * 用视频案例为你实战解读技术难点  * 聚焦Java技术疑难点,实战视频为你答疑解惑  * 越&qu ...

  6. Knapsack Problem

    背包九讲 0-1 knapsack problem 01背包-牛客网 已知一个背包最多能容纳体积之和为V的物品,现有 n 个物品,第 i 个物品的体积为 vi , 重量为 wi,求当前背包最多能装多大 ...

  7. 动态规划——背包问题(Knapsack Problem)入门

    动态规划算法 应用场景-背包问题 ​ 有一个背包,容量为4磅,现有如下物品: 物品 重量 价格 吉他(G) 1 1500 音响(S) 4 3000 电脑(L) 3 2000 要求达到的目标为装入的背包 ...

  8. 动态规划(dynamic programming)基础【背包问题】

    目   录 哔哩哔哩网站--动态规划基础 背包问题(1) 01背包 哔哩哔哩网站--[动态规划]背包问题 百度百科--背包问题 哔哩哔哩网站--动态规划基础 背包问题(1) 01背包 视频网址--哔哩 ...

  9. 动态规划背包问题之01背包详解

    文章目录 一.问题引入 1.什么是动态规划? 2.什么是背包问题? 3.什么是01背包? 4.背包问题怎么做? 二.例题讲解 1.题目: 2.分析 2.1 第一步:状态表示 2.2 第二步:确定状态转 ...

最新文章

  1. 技术大佬的肺腑之言:“不要为了 AI 而 AI”! | 刷新 CTO
  2. 参数化模型(parametric model)和非参数化模型non-parametric model)的区别?哪些模型是参数化模型,哪些模型是非参数化模型?
  3. 一个Python绘图示例程序中的几个语法糖果
  4. C语言解决汉诺塔问题
  5. 大数据WEB阶段(九)Servlet+Request
  6. linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc
  7. centos8安装中文(zh_CN)语言包
  8. python中的点的作用_Python基础学习中关键点的作用(三),python,重点,之,函数,3
  9. LeetCode 200. Number of Islands
  10. tomcat端口修改以及jvm启动参数设置
  11. java8读流_JAVA: Java8流逐行读取文件
  12. IE6——png图片的修复
  13. GetStyle,ModifyStyle,GetExStyle,ModifyStyleEx
  14. 操作系统的功能和意义
  15. python求解不等式组可行域_二元一次不等式(组)和可行域
  16. selenium的webdrive驱动安装(谷歌浏览器)
  17. 解决string not in pwd
  18. 报错:pymysql.err.IntegrityError: (1062, “Duplicate entry ‘1‘ for key ‘mm.PRIMARY‘“)
  19. 媒体中心软件专题:XBMC
  20. 学校计算机及班班通工作责任书,市北区qut班班通qut计算机管理使用规定细则.doc...

热门文章

  1. 什么是dropout?
  2. Java中基本数据类型是几种_JAVA中的基本数据类型有八种,分别是:( )、( )、( )、(...
  3. Nets Wire has multiple names
  4. 新目标大学英语综合教程2_课后答案
  5. android 获取 imei号码,android设计模式原则
  6. 使用内连接查询选修了Java程序基础_使用内连接 查询选修了“java程序基础”课程的学生学号、姓名、课程号、课程名和期末成绩_学小易找答案...
  7. _ext.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZN6caffe26deta
  8. 基于asp.net的在线音乐网站的设计与实现(完整)
  9. 通达信服务器在哪个文件夹,通达信软件系统公式在安装目录什么地方?
  10. mysql映射表_[玩转MySQL之四]MySQL缓存机制