动态规划过程

动态规划过程

应用背包问题:分享一下
有一个背包,容量是4磅,现有如下产品

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

思路分析:算法其实是模型建立的过程

  • 分析 建模的过程:
  • 横向房物品的重量,从0~4磅
  • 纵向是放的物品
    第一层,只能放一个吉他
    第二层,能放吉他和音响
    第三层,吉他,音响和电脑
  • 依据建模过程,进行背包填表如下图:
  • 设计 一个二维数组,i 为行数表示第几行,j为列(表示装入的重量)如上图所示:设计第一行,和第一列为0 不放入任何东西;
  • 声明 w[i] ,val[i] 分别表示 第i个物品的重量和价值
    w[i] 表示物品的重量 ,代码映射 int [] w={1,3,4},int[] val[]={1500,3000,2000};
  • int [][] v 变量存放 每个表格存放物品的最大价值
    分析得出模型
  • 构建算法模型,注意考虑!临界条件(边界条件)
    条件 :w[i]>j 时 v[i][j]= v[i-1][j]
    w[j]<=j 时 v[i][j] =max(v[i-1],v[i]+v[i-1][j-w[i]])
    算法的思想: 利用动态规划来解决,每次遍历第i个物品,根据 w[i],v[i] 来决定是否放入到背包中。01问题(只能添加一次,要么有,要么没有)

代码后续补上;
在这里插入代码片
下面展示一些 内联代码片

package acm;/*** @author qxl*/
public class KnapsackProblem {public static void main(String[] args) {knapsack();}public static   void  knapsack(){// 背包的重量int [] w={1,4,3};//背包物品的价值int [] val={1500,3000,2000};//表格为4列int n=w.length;//表格有5列int m=val.length;int[][] v=new int[n+1][m+2];//表格初初始化,依据分析初始化 表格 第一行和第一列都为空// 二维数组 v.length  一维数组存放,每个行一维数组的地址for(int i=0;i<v.length;i++){v[i][0]=0;}// v[0].length 列数for(int i=0;i<v[0].length;i++){v[0][i]=0;}//遍历打印推演的价值表格for(int i=0;i<v.length;i++){for(int j=0;j<v[0].length;j++){System.out.print(v[i][j]+" ");}System.out.println();}// 分析出的模型: 当w[i]>j  v[i]=v[i-1][j] 注意!!理解 j-w[i] 求出 放入当前行物品后,剩余的重量;i-1 表示当前行上一行//  w[i]<=j   v[i]=max{v[i-1][j],v[i]+v[i-1][j-w[i]]}// O(n^2) 的时间复杂度//注意 第一行和第一列都为0 因此循环从第一个值开始for(int i=1;i<v.length;i++){//体现是思想,建模过程中涉及到的问题for(int j=1;j<v[0].length;j++){// 注意!! w 和val 从下标1开始的,这里要注意了 都要进行 i-1;if(w[i-1]>j){v[i][j]=v[i-1][j];}else{// 由于遍历是从1开始的 因此 w[i]<=j 时候 v[i]= max{v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]}  其中注意! val[i-1]// w[i-1] 主要是循环下标从1 开始的;v[i][j]= Math.max(v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]);}}}//遍历打印推演的价值表格for(int i=0;i<v.length;i++){for(int j=0;j<v[0].length;j++){System.out.print(v[i][j]+"  ");}System.out.println();}}
}

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

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

相关文章

【剑指offer - C++/Java】5、用两个栈实现队列

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 牛客网题目链接&#xff1a;用两个栈实现队列 文章目录1、题目分析2、代码Java代码&#xff1a;C代码3、总结题目描述&#xff1a; 用两个栈来实现一…

【剑指offer - C++/Java】6、旋转数组的最小数字

题目链接&#xff1a;旋转数组的最小数字 文章目录1、题目描述2、题目分析3、代码3.1 Java代码3.2、C代码4、总结1、题目描述 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转&#xff0c;输出旋转数组的最小…

设计模式-责任链模型

责任链模式场景: OA审批系统 CEO 审批项目 经费 500万<x ≤\leq≤ 1000万总监 审批的经费 300万 < x ≤\leq≤ 500万总监秘书 审批的经费 100万< x ≤\leq≤ 300万研发经理 审批的经费 50万 <x ≤\leq≤ 100万 传统方式 是 (接收到请求后&#xff0c;根据相应金额&…

【OS学习笔记】三 计算机的启动过程

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章迈进了汇编的大门&#xff0c;点击链接查看上一篇文章&#xff1a;汇编语言和汇编软件 上一篇文章大概学会以下内容&#xff1a; 了解汇编…

【OS学习笔记】四 什么是虚拟机

虚拟机是软件 对于第一次听说虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;的人来说&#xff0c;可能以为还要再花钱买一台计算机&#xff0c;这恐怕是他们最担心的。所谓虚拟机&#xff0c;就是在你的计算机上再虚拟出另一台计算机来。这台虚拟出来的计算机&…

TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])

TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快&#xff0c;接收方可能会来不及接收&#xff0c;这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快&#xff0c;要让接收方来得及接收。 利用滑动窗口机制可以很方便地在TCP连接上实现…

英语词源记忆法

英语词源记忆法后续持续更新中

【OS学习笔记】五 VirtualBox的下载、安装和配置

上一篇文章学习了&#xff1a;计算机的启动过程&#xff08;点击链接查看上一篇文章&#xff09; 今天来接着上一篇文章&#xff0c;解决我们学习中的实验环境问题。 参考&#xff1a;X86汇编语言-从实模式到保护模式。作者李忠。纯学习笔记。如有侵权请联系我删除 1、下载O…

spring体系思维导图

spring体系思维导图1. spring 思维导图2. springboot 思维导图3. springcloud 思维导图之前整理的&#xff0c;后续持续更新中1. spring 思维导图 2. springboot 思维导图 3. springcloud 思维导图

idea模板

idea模板1.类注解模板2.方法注解模板3.自定义代码生成模板每次下载新版本的idea 或者换笔记本都需要重新&#xff0c;配置注解&#xff0c;而且从网上找了很多都或多或少有问题&#xff0c;每次要花费一些时间配置&#xff0c;这里整理一下。自定义代码生成模版&#xff0c;设置…

【OS学习笔记】六 实模式:编写主引导扇区代码

上一篇文章学习了&#xff1a;计算机的启动过程&#xff08;点击链接查看上一篇文章&#xff09; 这篇文章学习记录为&#xff1a;编写主引导扇区代码。 参考&#xff1a;《X86汇编语言-从实模式到保护模式》-李忠。纯学习笔记&#xff0c;更详细内容请阅读正版书籍。如有侵权…

【OS学习笔记】七 Bochs的下载、安装和配置

参考&#xff1a;《X86汇编语言-从实模式到保护模式》-李忠。纯学习笔记&#xff0c;更详细内容请阅读正版书籍。 1 开源的BOCHS虚拟机软件 Bochs是开源软件。它用软件来模拟处理器取指令和执行指令的过程&#xff0c;以及整个计算机硬件。当它开始运行时&#xff0c;就直接模…

【OS学习笔记】八 实模式:编写主引导扇区代码-另一种更高效的写法

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章&#xff0c;我们用比较原始的方法编写了主引导扇区的代码。点击链接查看上一篇文章&#xff1a;编写主引导扇区代码 本片文章将学习以下内…

【OS学习笔记】九 实模式:从汇编的角度理解栈结构

上一篇文章以一种更加高效的方法编写了主引导扇区的代码。主要是引入了循环和跳转指令。点击链接查看上一篇文章&#xff1a;编写主引导扇区代码-另一种更高效的写法 本篇文章&#xff0c;继续上一篇文章的学习。同样还是编写汇编代码加载到主引导扇区让CPU直接执行。但是我们…

【OS学习笔记】十 实模式:实现一个程序加载器-程序加载器如何将用户程序加载到内存并执行

上一篇文章学习了以下内容&#xff1a; 用一种不同的分段方法&#xff0c;从另一个不同的的角度理解处理器的分段内存访问机制使用循环和条件转移指令来优化主引导扇区代码 点击链接查看上一篇文章&#xff1a;点击链接查看 对于主引导扇区部分。大概前几篇文章已经学的差不…

【OS学习笔记】十一 实模式:中断-软中断和硬中断基本原理

上一篇文章我们模拟操作系统的加载器程序&#xff0c;使用汇编语言实现了一个程序加载器&#xff1a;点击链接查看上一篇文章&#xff1a;程序加载器的实现原理 本篇文章&#xff0c;是实模式学习的结尾。在经过了那么多坎坷&#xff0c;终于学完了8086的实模式&#xff01;&a…

配置节处理程序时出错,未能加载文件或程序集

安装sql server2008时&#xff0c;出现下面的错误&#xff1a; 按照上面的提示&#xff0c;查看那个路径下的文件&#xff0c;根据文件名判断可能是临时文件&#xff0c;于是首先将上面的文件剪切出来&#xff0c;然后安装&#xff0c;成功。 转载于:https://www.cnblogs.com/x…

【软件开发底层知识修炼】六 Binutils辅助工具之- addr2line与strip工具

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章我们学习了gcc编译器的相关内容。点击查看上一篇文章&#xff1a;gcc编译器。本篇文章接着上一篇文章&#xff0c;学习GNU为GCC提供的辅助开…

Eboot 中给nandflash分区实现

提到分区就不得不提到MBR&#xff0c;不得不提到分区表。 什么是MBR 硬盘的0柱面、0磁头、1扇区称为主引导扇区&#xff0c;NANDFLASH由BLOCK和Sector组成&#xff0c;所以NANDFLASH的第0 BLOCK&#xff0c;第1 Sector为主引导扇区&#xff0c;FDISK程序写到该扇区的内容称为主…