动态规划.背包问题--填满背包的最大价格(java)

news/2024/11/20 23:33:08/

背包问题--填满背包的最大价格

  • 题目描述
  • 暴力递归
    • 解题思路
    • 代码演示
  • 动态规划
    • 解题思路
    • 代码演示
  • 动态规划专题

题目描述

背包问题 给定两个长度都为N的数组weights和values,weights[i]和values[i]分别代表 i号物品的重量和价值 给定一个正数bag,表示一个载重bag的袋子,装的物品不能超过这个重量 返回能装下的最大价值

暴力递归

解题思路

要向获得最大值,其实就是在每一个物品之中做选择.
找出选择的最优解.
有了这个思路,那么递归就是在一个商品上选和不选去比较最大值,
递归的就已经出来了.
然后讨论base case 了,
一.weights 数组越界,没有商品可以选了,肯定是个结束条件
二.背包没有空间去装了,也是个base case 要返回的.
递归的结构和base case 都有了,直接看代码吧

代码演示

 /*** 获取最大值* @param w* @param v* @param bag* @return*/public static int maxValue(int[]w,int[]v,int bag){//参数校验,题目中其实已经对数据限制了,if (null == w || v == null || w.length != v.length || w.length == 0 || bag < 0 ){return 0;}return process(w,v,0,bag);}/*** 递归方法* @param weights 不同商品重量* @param values 商品价值 和重量一一对应* @param index 下标值 代表要选第几号商品了* @param bag 背包容量* @return*/public static int process(int[]weights,int[]values,int index,int bag){//base case 越界if (index == weights.length){return 0;}//返回-1 为了对无效选择做判断if (bag < 0){return -1;}//选和不选两个状态//不选的情况int p1 = process(weights,values,index + 1,bag);//选的情况int p2 = 0;//选的情况int next = process(weights,values,index + 1,bag - weights[index]);// 返回 -1  代表 bag - weights[index] 这个选择是无效 的.//也就是index 这个选择是无效的 就不能执行if 里面的//也可以先判断bag - weights[index] < 0 来判断,小于0 就不进行递归// 和利用返回值判断是一样的,随你心情if (next != -1){p2 = values[index] + next;}//选择最大值return Math.max(p1,p2);}

动态规划

解题思路

动态规划,其实就是对递归过程的抽象化.把递归放在一张表中
递归改动态规划:
首先要看递归的base case,这样能知道如何初始化值.
其次要看递归过程,
下面代码演示下

代码演示

  /*** 动态规划* @param w* @param v* @param bag* @return*/public static int dp(int[]w,int[]v,int bag){//参数校验if (null == w || v == null || w.length != v.length || w.length == 0 || bag < 0 ){return 0;}int N  = w.length;//动态规划表//初始化的过程 看递归的base case  index == N 是0,//数组本身就是0 因此不需要显示的初始化int[][] dp = new int[N + 1][bag + 1];//看递归过程,来决定如何改动态规划//由于base case 是到N 开始返回的//所以dp 要从N - 1 开始填充值.//因此从N - 1开始循环for (int i = N - 1;i >= 0;i--){for (int k = 0; k <= bag;k++){// int p1 = process(weights,values,index + 1,bag);// 这一行代码 就是递归改动态规划,int p1 = dp[i + 1][k];//选的情况int p2 = 0;// int next = process(weights,values,index + 1,bag - weights[index]);// 看下两着是不是一样 只是一个递归 一个表中取.int next = bag - w[i] < 0 ? -1 : dp[i + 1][bag - w[i]];if (next != -1){p2 = v[i] + next;}dp[i][k] = Math.max(p1,p2);}}return dp[0][bag];}

动态规划专题

纸牌博弈问题–动态规划

爬楼梯问题-从暴力递归到动态规划

走到指定位置有多少种方式-从暴力递归到动态规划

零钱兑换,凑零钱问题,从暴力递归到动态规划

斐波那契数列-从暴力递归到动态规划


http://www.ppmy.cn/news/152901.html

相关文章

Computer:IPFS(星际文件系统)的简介、安装、使用方法之详细攻略

Computer&#xff1a;IPFS(星际文件系统)的简介、安装、使用方法之详细攻略 目录 IPFS的简介 1、IPFS的应用 IPFS的安装 IPFS的使用方法 1、下载文件 第一步&#xff0c;启动IPFS节点 第二步&#xff0c;获取文件的CID 第三步&#xff0c;下载文件 IPFS的简介 星际文件…

网咖虚拟服务器主机,为什么网吧的主机这么便宜??但是玩大型游戏又不卡

原标题&#xff1a;为什么网吧的主机这么便宜&#xff1f;&#xff1f;但是玩大型游戏又不卡 经常到正规网吧玩游戏的朋友就会发现&#xff0c;网吧电脑玩起来很流畅&#xff0c;是什么原因&#xff0c;难道它们配置很高吗&#xff1f;其实它们的配置也不是很高&#xff0c;只是…

如何配置一台计算机预计3500元,玩游戏用的电脑主机应该怎么配置?3500元组装游戏电脑主机配置推荐...

本文转自:http://www.dn010.com/peizhi/950.html 玩游戏用的电脑主机应该怎么配置?喜欢玩游戏的朋友都想配置一台游戏电脑,今天电脑组装知识网给大家带来3500元组装游戏电脑主机配置推荐,主机的价位在3500元,很符合主流游戏用户的价格区间,高特效LOL,cf,中特效吃鸡、大…

计算机应该玩什么游戏,电脑玩游戏主要靠什么配置

现如今的很多网友都喜欢玩大型的网络游戏,但是,在玩游戏的同时很多时候会发现自己的电脑的配置跟不上,以下,小编会给大家简要的介绍一下,并且会举一些大家常玩的网络大型游戏的装备。 一、电脑玩游戏主要靠的是什么? 1、显卡,在看所有的配置之前,肯定首要的就是显卡。现…

什么是游戏服务器

什么是游戏服务器 游戏服务器是游戏客户端用来玩多人游戏的本地或远程服务器。大多数通过 Internet 玩的游戏都是通过连接到游戏服务器来运行的。 什么是游戏客户端&#xff1f; 游戏客户端是连接到游戏服务器的软件程序。服务器提供连接并向客户端发送信息包。许多客户端可…

游戏行业之继往开来

继往 随着摩尔定律逐渐变成营销的噱头,游戏产业伴着硬件的革新出现了百家争鸣的盛况,从家庭主机、PC端到如今越来越重要的移动平台,都成了兵家必争之地。 改革开放以来中国国民GDP增长、教育素质提升,人们对PC端的消费,从一开始的各路盗版、白嫖转到如今steam、orange、…

为什么用于打游戏的计算机需要独立显卡,玩游戏,教给您一些购买独立显卡的注意事项...

在玩游戏时&#xff0c;我不是那么精通&#xff0c;还是领域的外行&#xff1f;如果您是游戏迷&#xff0c;那么您肯定会喜欢一个&#xff0c;两个或多个游戏&#xff0c;那么我们如何确保购买适合您的显卡&#xff1f;为什么说在玩游戏之前必须确定显卡&#xff1f;它不是CPU吗…

计算机包括台式机和笔记本,外星人Area-51M游戏笔记本评测:比台式机更强悍的笔记本...

Area-51M是一台浑身散发出野性的电脑,你会觉得它就是人们想像中的游戏笔记本电脑的样子,它很笨重,绝不是一台轻薄型笔记本电脑。然而,使它与众不同的是内在的强大性能,这种强大的性能一般只有在台式机中才有。比如英特尔的八核i9-9900K CPU,NVIDIA的RTX GPU和最高64GB的内…