算法-动态规划

动态规划算法

应用场景-背包问题
在这里插入图片描述

介绍

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

背包问题思路分析和图解

  • 思路分析
    • 背包问题主要是指一个给定容量的背包、若干具有一定价值和重量的物品,如何选择物品放入背包使物品的价值最大。其中又分01背包和完全背包(完全背包指的是:每种物品都有无限件可用)
    • 这里的问题属于01背包,即每个物品最多放一个。而无限背包可以转化为01背包。
  • 算法的主要思想,利用动态规划来解决。每次遍历到的第i个物品,根据w[i]和v[i]来确定是否需要将该物品放入背包中。即对于给定的n个物品,设v[i]、w[i]分别为第i个物品的价值和重量,C为背包的容量。再令v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值。则我们有下面的结果:

在这里插入图片描述

在这里插入图片描述

代码实现

public class DP {public static void main(String[] args) {int[] w = {1,4,3}; //物品的重量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];//为了记录放入商品的情况,我们定一个二维数组int[][] path = new int[n+1][m+1];//初始化第一行和第一列,但是我们这里默认是0就不用处理//根据前面公式来动态规划处理for (int i = 1; i < v.length; i++) { //第一行从1开始for (int j = 1; j < v[0].length; j++) { //不处理第一列,从1开始//公式if(w[i-1] > j){ //因为我们程序从1开始,所以原来的公式需要i-1v[i][j] = v[i-1][j]; //当准备加入新增的商品的容量大于 当前背包的容量时,直接使用上一个单元格的数据}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];}}}}//输出一下v看看目前的情况for (int i = 0; i < v.length; i++) {for (int j = 0; j < v[i].length; j++) {System.out.print(v[i][j] + " ");}System.out.println();}System.out.println("==============");//输出最后我们是放入的哪些商品//遍历path,这样输出会把所有的放入情况都得到,其实我们只需要最后的放入int i = path.length-1;int j = path[0].length-1;while (i > 0 && j > 0){if(path[i][j] == 1){System.out.printf("第%d个商品放入到背包\n",i);j -= w[i-1];}i--;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/290179.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MaBatis使用`ResultMap`标签手动映射详解使用

文章目录 MaBatis使用ResultMap标签手动映射详解使用1、MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系&#xff0c;二者不同时无法自动ORM&#xff0c;如下&#xff1a;2、在SQL中使用 as 为查询字段添加列别名&#xff0c;以匹配属性名&#xff1a;但是如果我…

【Hadoop精讲】HDFS详解

目录 理论知识点 角色功能 元数据持久化 安全模式 SecondaryNameNode(SNN) 副本放置策略 HDFS写流程 HDFS读流程 HA高可用 CPA原则 Paxos算法 HA解决方案 HDFS-Fedration解决方案&#xff08;联邦机制&#xff09; 理论知识点 角色功能 元数据持久化 另一台机器就…

nginx转发ingress-nginx问题记录

背景 想直接通过域名访问k8s上的服务. 想到k8s上可以直接通过ingress配置. 不过ingress默认启动的端口3xxxxx. 一般不可能让用户访问我们的服务加上端口. 所以现在要解决直接通过80端口访问ingress的问题. 方案 修改ingress-nginx端口(这个是在网上搜到的方案, 但未选择) 这…

ssm基于vue技术的绿色蔬菜销售管理系统+vue论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本绿色蔬菜销售管理就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

2023最新最全【MYSQL】8.0.11下载,零基础入门到精通

1、下载安装&#xff1a; MySQL8下载地址&#xff1a;点击No thanks 点击底部“No thanks, just start my download.”直接下载就行。 然后将压缩包解压到电脑&#xff0c;直接抄我的 D:\Program Files (x86)\mysql\mysql-8.0.11-winx64 2、配置环境&#xff08;win10&#x…

神经网络:优化器和全连接层

SGD&#xff08;随机梯度下降&#xff09; 随机梯度下降的优化算法在科研和工业界是很常用的。 很多理论和工程问题都能转化成对目标函数进行最小化的数学问题。 举个例子&#xff1a;梯度下降&#xff08;Gradient Descent&#xff09;就好比一个人想从高山上奔跑到山谷最低…

云原生系列2-CICD持续集成部署-GitLab和Jenkins

1、CICD持续集成部署 传统软件开发流程&#xff1a; 1、项目经理分配模块开发任务给开发人员&#xff08;项目经理-开发&#xff09; 2、每个模块单独开发完毕&#xff08;开发&#xff09;&#xff0c;单元测试&#xff08;测试&#xff09; 3、开发完毕后&#xff0c;集成部…

海康威视运行管理中心 Fastjson RCE

漏洞描述 海康威视运行管理中心系统存在低版本Fastjson远程命令执行漏洞&#xff0c;攻击者可在未鉴权情况下获取服务器权限&#xff0c;且由于存在相关依赖&#xff0c;即使服务器不出网无法远程加载恶意类也可通过本地利用链直接命令执行&#xff0c;从而获取服务器权限。 漏…

AMD和CMD的区别

AMD和CMD的区别 AMD和CMD的区别 AMD和CMD的区别 依赖引入不同 AMD: 依赖前置 CMD:就近依赖模块导出不同 AMD:return 返回值 CMD:exports //CMD define(function(){//依赖就近书写var module1 require(Module1);var result1 module1.exec();//exports导出module.exports {r…

【RTOS学习】源码分析(信号量和互斥量 事件组 任务通知)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;信号量和互斥量&#x1f345;创建&#x1f345;Take&#x1f345;Give &#x…

【SpringMVC】SpringMVC的请求与响应

文章目录 0. Tomcat环境的配置1. PostMan工具介绍创建WorkSpace建立新的请求 2. 请求映射路径案例结构与代码案例结构案例代码 案例存在问题解决方案方法方法升级版——配置请求路径前缀注解总结 3. Get请求与Post请求案例结构与案例代码案例结构案例代码 Get请求Post请求接收中…

c++打开网页

1.使用ShellExecute 效果图&#xff1a; 相关代码: void Open_url::on_pushButton_clicked() {QString path1 "explorer.exe";QString urlui->lineEdit->text();ShellExecute(NULL, L"open", path1.toStdWString().c_str(), url.toStdWString().c…