当前位置: 首页 > news >正文

做网站的资料修改佛山关键词排名工具

做网站的资料修改,佛山关键词排名工具,2022最新传奇手游,网站秒杀小程序怎么做背包问题其实有很多种,01背包是最基础也是最经典的,软工计科学生一定要掌握的。 01背包问题 代码随想录 视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经…

背包问题其实有很多种,01背包是最基础也是最经典的,软工计科学生一定要掌握的。


01背包问题

代码随想录

视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili

思路

        直接上动态规划五部曲

1、dp数组及其下标的含义

对于背包问题,有一种写法, 是使用二维数组,即dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少

2.确定递推公式

再回顾一下dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

那么可以有两个方向推出来dp[i][j],

  • 不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。)
  • 放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值

所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

3.初始化

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。

再看其他情况。

状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。

dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

那么很明显当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。

当j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。

4.确定遍历顺序

在如下图中,可以看出,有两个遍历的维度:物品与背包重量

动态规划-背包问题3

那么问题来了,先遍历 物品还是先遍历背包重量呢?

其实都可以!! 但是先遍历物品更好理解

5.举例验证,直接看链接里的吧。

代码
def test_2_wei_bag_problem1():weight = [1, 3, 4]value = [15, 20, 30]bagweight = 4# 二维数组dp = [[0] * (bagweight + 1) for _ in range(len(weight))]# 初始化for j in range(weight[0], bagweight + 1):dp[0][j] = value[0]# weight数组的大小就是物品个数for i in range(1, len(weight)):  # 遍历物品for j in range(bagweight + 1):  # 遍历背包容量if j < weight[i]:dp[i][j] = dp[i - 1][j]else:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])print(dp[len(weight) - 1][bagweight])test_2_wei_bag_problem1()

01背包滚动数组

代码随想录

视频讲解:带你学透01背包问题(滚动数组篇) | 从此对背包问题不再迷茫!_哔哩哔哩_bilibili

 看链接吧,老是复制粘贴累了。


416.分割等和子集

本题是 01背包的应用类题目

代码随想录

视频讲解:动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集_哔哩哔哩_bilibili

思路

        就是01背包的应用,背包的大小是总和的一半,遍历每一个物品,看看遍历到最后能不能装满这个背包。

代码(二维版本在链接里)
class Solution:def canPartition(self, nums: List[int]) -> bool:if sum(nums) % 2 != 0:return Falsetarget = sum(nums) // 2dp = [0] * (target + 1)for num in nums:for j in range(target, num-1, -1):dp[j] = max(dp[j], dp[j-num] + num)return dp[-1] == target
http://www.ds6.com.cn/news/81337.html

相关文章:

  • 找合伙人做网站地推接单平台
  • wordpress 工作流成都seo学徒
  • 什么网站做简历模板百度信息流是什么
  • 市场营销策划书500字seo搜索引擎优化薪资
  • 做网站设计的平台世界杯球队最新排名
  • 评价高的企业网站开发百度高级搜索入口
  • 网站模版免费下载成都网站建设团队
  • 宏润建设集团网站五年级上册语文优化设计答案
  • 英文独立站建设公司哪家好个人网页怎么制作
  • 蜘蛛云建站网站热搜榜上2023年热门话题
  • 南昌网站设计资讯制造企业网站建设
  • 要怎么做网站培训网站源码
  • 创一家网站数字营销
  • 广东做网站策划锦州网站seo
  • 阿里云网站建设好了怎么青岛seo优化
  • 网站开发功能脑图seo+网站排名
  • 临沂网站建设电话目前疫情最新情况
  • 温州做网站的公司有哪些360免费建站
  • 邹平做网站网络营销的优势有哪些
  • 昌乐网站建设搜索引擎站长平台
  • 东莞做网站多少钱网络建站工作室
  • php旅游网站开发背景游戏推广合作平台
  • 做网站的服务器很卡怎么办网站关键词排名优化方法
  • 合肥网站制作公司有哪些公司天津网站建设公司
  • 小贷网站需要多少钱可以做seo标题优化导师咨询
  • icp备案 网站负责人新闻投稿平台
  • 软件开发工程师的发展前景seo广告投放是什么意思
  • 初中生怎么做网站百度售后服务电话人工
  • 网站上传文件大小限制福鼎网站优化公司
  • 和政网站建设百度信息流广告推广