动态规划

动态规划算法介绍

动态规划算法最佳实践-背包问题

思路分析:

图解分析:

​Java代码实现:


动态规划算法介绍

1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法

2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)

4)动态规划可以通过填表的方式来逐步推进,得到最优解.

动态规划算法最佳实践-背包问题

背包问题主要是指一个给定容量的背包若干,具有一定价值和重量的物品,如何选择物品放入背包使物品的价值最大。其中又分01背包(01背包:每个物品只有一件可用)和完全背包(完全背包指的是:每种物品都有无限件可用)

背包问题案例:有一个背包,容量为4磅, 现有如下物品:

1)要求达到的目标为装入的背包的总价值最大,并且重量不超出4磅。

2)要求装入的物品不能重复。

思路分析:

1)这里的问题属于01背包,即每个物品最多放一个

2)算法的主要思想,利用动态规划来解决。每次遍历到的第i个物品,根据w[i]和v[i]来确定是否需要将该物品放入背包中。即对于给定的n个物品,设v[i]、w[i]分别为第i个物品的价值和重量,再令v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值。

则我们有下面的结果:

//表示填入表第一行和第一列是0
(1)v[i][0]=v[0][j]=0;
//当准备加入新增的商品的容量大于当前背包的容量时,就直接使用上一个单元格的装入策略
(2)当w[i]>j时: v[i][j]=v[i-1][j]
//当准备加入的新增的商品的容量小于等于当前背包的容量时:取【方案一:上一个单元格的价值】和【方案二:装入当前商品与其他商品的价值的总和】的最大值
(3)当j>=w[j]时: v[i][j]=max{v[i-1][j], v[i]+v[i-1][j-w[i]]
//[i-1][j]:就是上一个单元格的价值
//v[i]:表示当前商品的价值
//v[i-1][j-w[i]]:在剩余j-w[i]空间里,装入【i-1】即【即i前面的某个或某几个】商品以达到价值最大化
//v[i]+v[i-1][j-w[i]]:装入当前商品与其他商品的价值的总和

图解分析:

Java代码实现:

public class KnapsackProblem {//01背包问题public static void main(String[] args) {int[] w = {1, 4, 3};//物品的重量int[] val = {1500, 3000, 2000};//物品的价值int m = 4;//背包的容量int n = val.length;//物品的个数//为了记录放入商品的情况,我们定义一个二维数组int[][] path = new int[n + 1][m + 1];//创建二维数组//v[i][j]:表示在前i个物品中能够装入容量为j的背包中的最大价值int[][] v = new int[n + 1][m + 1];//初始化第一行和第一列【可有可无】for (int i = 0; i < v.length; i++) {//v.length:获取二维数组的行数v[i][0] = 0;//将第一列设置为0}for (int i = 0; i < v[0].length; i++) {//v[0].length:获取二维数组的列数v[0][i] = 0;//将第一行设置为0}//根据前面得到的公式来动态规划for (int i = 1; i < v.length; i++) {//int i = 1 不处理第一行for (int j = 1; j < v[0].length; j++) {//int j = 1 不处理第一列if (w[i - 1] > j) {//因为我们的程序的i是从1开始,所以原来公式里的w[i]-->>w[i-1]v[i][j] = v[i - 1][j];//v[1][1]从第二行第二个开始} else {//因为我们的程序的i是从1开始,因此要调整://为了记录商品存放到背包的情况,我们不能直接的使用上面的公式,,需要使用if-else语句if (v[i - 1][j] < (val[i - 1] + v[i - 1][j - w[i - 1]])) {v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];//把当前情况记录到pathpath[i][j] = 1;} else {v[i][j] = v[i - 1][j];}}}}//输出二维数组:for (int[] ints : v) {System.out.println(Arrays.toString(ints));}//输出最后我们是放入的那些商品int i = path.length - 1;//行的最大下标int j = path[0].length - 1;//列的最大下标while (i > 0 && j > 0) {//从path的最后开始找if (path[i][j] == 1) {System.out.printf("第%d个商品放入背包\n", i);j -= w[i - 1];}i--;}}
}

长风破浪会有时,直挂云帆济沧海!

详解:动态规划算法【Java实现】——背包问题相关推荐

  1. 详解动态规划算法(Python实现动态规划算法典型例题)

    动态规划(Dynamic programming) 是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划算法是通过拆分问题,定义问题状态和状 ...

  2. 详解动态规划算法(Python)

    视频来源:https://www.bilibili.com/video/BV1xb411e7ww?from=search&seid=3112459103674479435 动态规划解题四组成部 ...

  3. java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现

    硬币找零问题是动态规划的一个经典问题,其中最少硬币找零是一个变种,本篇将参照上一篇01背包问题的解题思路,来详细讲解一下最少硬币找零问题.如果你需要查看上一篇,可以点击下面链接: 详解动态规划01背包 ...

  4. 详解动态规划01背包问题--JavaScript实现

    对其他动态规划问题感兴趣的,也可以查看 详解动态规划最少硬币找零问题--JavaScript实现 详解动态规划最长公共子序列--JavaScript实现 一开始在接触动态规划的时候,可能会云里雾里,似 ...

  5. 详解动态规划最长公共子序列--JavaScript实现

    前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...

  6. 【算法知识】详解堆排序算法

    点击蓝色字关注我们! 什么是堆 「堆」首先是一个完全二叉树,「堆」分为「大顶堆」和「小顶堆」: 「大顶堆」 : 每个节点的值大于或等于其左右孩子节点的值,称为大顶堆. 「小顶堆」同理就是每个节点的值小 ...

  7. 【算法知识】详解基数排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 [算法知识]详解归并排序算法 基本思想 基数排序的思想是将整数按位数切 ...

  8. 【算法知识】详解归并排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 基本思想 归并排序的基本思想是: 先将序列一次次分成子序列,直到子序列 ...

  9. 【算法知识】详解快速排序算法

    基本思想 已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 本文的思路是以从小到大为例讲的. 快速排序的基本思想是任取待排序序列的一个元素作为中心元素 ...

  10. 算法-详解堆排序算法

    title: 算法-详解堆排序算法 date: 2017-07-06 22:00:16 categories: 算法,面试 tags: [算法,Algorithm,面试,排序] description ...

最新文章

  1. 在Ubuntu 14.04 64bit上安装批量图片处理器XnConvert
  2. [图形学]切向空间(Tangent Space)
  3. linux VNC简单配置
  4. 《CDN 之我见》原理篇——CDN的由来与调度
  5. 多线程与高并发(四):LockSupport,高频面试题,AQS源码,以及源码阅读方法论
  6. HDU 1565 状态压缩
  7. [leetcode]Median of Two Sorted Arrays @ Python
  8. 雷鸟html签名设置,thunderbird 使用OpenPGP加解密邮件
  9. 【渝粤教育】国家开放大学2018年春季 3950T金融基础 参考试题
  10. Java程序细胞工厂_Spring Boot实现原理分析
  11. EDM邮件营销之如何制作模板
  12. java提升权限运行_提升代码的运行权限,实现模拟管理员身份的功能
  13. 简明python教程:数据结构
  14. 手机停机时,考虑允许低速上网以充值
  15. arcgis地理配准_【更新69篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
  16. 实用的视频去水印方法
  17. 游戏策划:为什么我的儿子不沉迷游戏?
  18. cosface:large margin cosine loss for deep face recognition
  19. Vue vben admin - 新鲜出炉的高颜值管理后台UI框架,基于 Vue3 和 Ant Design Vue
  20. 译《Office商业应用程序入门》

热门文章

  1. CSS技巧:字体霓虹灯特效
  2. [渝粤教育] 南京工业大学 有机化学实验 参考 资料
  3. 年终报告 20PPPT模板
  4. python-分分钟入门-简介
  5. 卡塞格伦天线 matlab,2018年哈工大电子与信息工程学院复试指导
  6. 关于 .pyc 文件
  7. 大学生学计算机的自我介绍范文带翻译,大学生英语自我介绍带翻译范文.doc
  8. 使用Java来解决鸡兔同笼的问题,现在一个笼子里(只有鸡和兔子)有35个头,94只足,请求出鸡与兔个多少?
  9. 【信用评分预测模型(一)】信用评分预测模型简介
  10. 【网络进阶】五种IO网络模型(一)