动态规划算法

  1. 动态规划(Dynamic Programing)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法
  2. 动态规划算法与分治算法类似,其基本思想也是将待求解的问题分成若干个子问题,然后从这些子问题的解得到源问题的解
  3. 与分治法不同的是,适合于动态规划算法求解的问题,经过分解得到的子问题往往不是互相独立的(即下一个阶段的求解是建立在上一个阶段上的)
  4. 动态规划可以通过填表的方式来逐步推进,从而得到最优解

背包问题

有一个背包,容量为4磅,现有如下物品

物品 重量 价格
吉他 1 1500
音响 4 3000
电脑 3 2000

1. 要求达到的目标为装入背包的总价值最大,并且重量不超出
2. 要求装入的物品不能重复

思路分析

  • 背包问题主要是指一个给定容量的背包,若干具有一定价值和重量的物品,如何选择物品放入背包使物品的价值最大,其中又分为01背包和完全背包(这里的问题是指01背包,完全背包是指每一种物品都有无限件可以使用)
  • 利用动态规划,每次遍历到第i个物品,根据w[i]和v[i]来确定是否需要将物品放入背包中。即对于给定的n个物品,设v[i]、w[i]分别为第i个物品的价值和重量,C为背包的容量。再令v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大值(即依次增加背包容量,然后根据前一个背包的容量的最优解的累计得到后一个容量的最优解)
  • 遍历物品的目的是细分物品的放入,依次增加一个物品供放入,来找到每次的最好的放入方式;从0增加背包容量是为了在某次当前物品放入时,对剩余容量的方法进行记录

步骤

  1. 首先遍历到吉他,重1磅,价格1500,从0开始依次增加背包的容量,如果能够将吉他放入,则将吉他放入,此时还只有吉他,所以不用考虑其他因素
  2. 再遍历到音响,重4磅,加个3000,从0开始依次增加背包容量,如果不能将音响放入,则表示还是只能按照之前的放法,则复制上一次遍历对应背包容量的值,如能够将音响放入,那么将音响放入,然后看有没有剩余空间,如果有,那么找到上一轮次的剩余空间(因为物品不能重复放入)对应的背包容量放入的价格,两个价格相加,然后再跟上一轮次相同容量的价格作比较,取大值

公式

i:物品的编号,第i个物品
j:背包的容量
w[i]:第i个物品的重量
v[i]:第i个物品的价格
v[i][j]:前i个物品装入容量为j的背包的最大价值

  1. v[i][0]=v[0][j]=0——当前没有物品可放,或者背包没有容量的时候,价值都是0
  2. 当w[i]>j时,v[i][j]=v[i-1][j]——当前物品的重量大于背包的容量,取上一个物品相同容量的最大价值
  3. 当j>=w[i]时,v[i][j]=max{v[i-1][j],v[i-1][j-w[i]]+v[i]}——当前物品的重量小于或等于背包的容量,在上一个物品相同容量的最大价值,和当前物品的价值加上剩余容量对应上一轮次的价值之和,两者最大值

代码实现

/**** 背包问题* @author laowa**/
public class Knapsack {public static void main(String[] args) {// 物品的重量int[] w = {1,4,3};// 物品的价格,val[i]就表示v[i]int[] val = {1500,3000,2000};// 背包的重量int m = 4;// 物品的个数int n = val.length;// 初始化二维数组,v[i][j]表示前i个商品在容量为j的背包中存入的最大价值int v[][] = new int[n+1][m+1];// 初始化第一行和第一列for(int i=0;i<v.length;i++) {v[i][0] = 0;}for(int i=0;i<v[0].length;i++) {v[0][i] = 0;}// 外层循环遍历物品,内层循环从1开始递增背包容量// 因为已经初始化过,这里就不需要处理第一个公式for(int i=1;i<v.length;i++) {for(int j=1;j<v[0].length;j++) {// 当前商品的重量大于背包的容量,因为这里遍历的是二维数组v,所以取w和val的时候需要i-1if(w[i-1]>j) {//沿用上一次的价格v[i][j] = v[i-1][j];}else {// 当前商品的重量小于等于背包的容量v[i][j] = Math.max(v[i-1][j], val[i-1]+v[i-1][j-w[i-1]]);}}}print(v);}/*** 打印数组* @param array 需要打印的数组*/private static void print(int[][] array) {for(int i=0;i<array.length;i++){System.out.println(Arrays.toString(array[i]));}}}

数据结构与算法(十九)——动态规划相关推荐

  1. 数据结构和算法(十)递归-迷宫游戏

    1. 数据结构和算法(十)递归-迷宫游戏 1.1 迷宫游戏   今天做一个简单的迷宫游戏,用二维数实现地图,让程序自动寻路的小游戏. 1.2 简单的迷宫 简单的迷宫 用二维数实现地图,找路策略:[右- ...

  2. 09_JavaScript数据结构与算法(九)字典

    JavaScript 数据结构与算法(九)字典 字典 字典特点 字典存储的是键值对,主要特点是一一对应. 比如保存一个人的信息 数组形式:[19,"Tom", 1.65],可通过下 ...

  3. 【数据结构与算法】之动态规划经典问题

    前言 本文为 [数据结构与算法]动态规划 经典问题相关介绍 ,具体将对最长递增子序列问题,找零钱问题,0-1背包问题相关动态规划算法问题进行详尽介绍~

  4. 数据结构与算法(十二):八大经典排序算法再回顾

    文章出自汪磊的博客,未经允许不得转载 一.排序的理解 提到排序大部分同学肯定第一时间想到int数组的排序,简单啊,所谓排序不就是将int数组按照从大到小或者从小到大排序吗,如果我有个数组存放的不是in ...

  5. Java数据结构与算法(九)-程序员常用的10中算法

    本章目录 第14章 程序员常用的10中算法 14.1 二分查找算法(非递归) 14.1.1 二分查找算法(非递归)介绍 14.2 分治算法 14.2.1 分治算法介绍 14.2.2 分治算法最佳实践- ...

  6. 数据结构与算法(九)—— 图(无向图)

    在现实生活中,有许多应用场景会包含很多点以及点点之间的连接,而这些应用场景我们都可以用即将要学习的图这种数据结构去解决. 1.图的定义及分类 图是由一组顶点和一组能够将两个顶点相连的边组成的 1 . ...

  7. 数据结构与算法(十六)冒泡排序和鸡尾酒排序

    冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,以将当前序列的最小值交换到当前序列最前端为一轮结束,需要(length-1)轮,感觉数据是一 ...

  8. 数据结构与算法——十大排序

    排序 1.排序的基本定义 排序:就是使一串记录,按照其中的某个或者某些关键字的大小,递增或递减的排列起来的操作. 排序算法:就是如何使得记录按照要求排列的方法.排序算法在很多领域都得到很大的重视,尤其 ...

  9. 【王卓】数据结构与算法图(九)

    ✍.目录脑图 目录 ✍.目录脑图 1.图 1.1.图的定义 1.2.图的术语 1.3.图的存储结构 1.3.1.邻接矩阵(数组)表示法 1.3.1.1.无向图的邻接矩阵表示法 1.3.1.2.有向图的 ...

最新文章

  1. 土拍熔断意味着什么_半小时3宗地接连熔断 今日长沙土拍关键字:“焱”
  2. 树莓派ssh连接问题
  3. php语句过滤掉html标签_php过滤HTML标签、属性等正则表达式
  4. 二分最大匹配(匈牙利算法+HK算法)
  5. matlab没有曲线,有个程序,运行后只有坐标没有曲线,是怎么回事呢 望大神们解答...
  6. python生成密码字典
  7. 银联的支付创新产业基地将落户安徽合肥 投资达80亿
  8. 苹果手机来电归属地_Python批量查询手机号码归属地
  9. RQNOJ 能量项链
  10. python与审计底稿关系_干货!审计底稿,六大禁忌
  11. miui修改Android,修改 MIUI「快捷开关」布局
  12. 快排 c语言,c语言的库函数之快排
  13. 距离最短原则的离散点连接 Python实现
  14. 扭蛋机(bilibili)
  15. 12306多线程抢票
  16. 富文本编辑器 —— 学习笔记
  17. 暑假的计划【写在这里,监督自己】
  18. scratch字母点头问好 电子学会图形化编程scratch等级考试一级真题和答案2020-9
  19. php md5算法,php如何实现md5算法?
  20. CentOS 7上编译安装PHP 8.1及Nginx 配置支持PHP

热门文章

  1. 推荐几本关于R语言的书
  2. 服务器被攻击了怎么办,如何追查DDoS攻击源头
  3. 珠宝行业iPad展销系统
  4. 阿里健康大药房联合蚂蚁森林推出神奇动物公益口罩
  5. Facebook COO桑德伯格
  6. Java中的微信支付:API V3对微信服务器响应进行签名验证3
  7. VS2008下使用CppSQLite3访问xgs黑名单表(SQLite数据库)
  8. 2020笔记本性价比之王_2020年性价比高的笔记本电脑选什么?
  9. (转)如何将数据上传到onenet服务器(https://blog.csdn.net/qq_29219435/article/details/78471448)
  10. 华为鸿蒙os手机入网,鸿蒙OS手机入网,华为P50无缘首发,猜猜哪一款?