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

魏县网站制作小程序免费制作平台源码

魏县网站制作,小程序免费制作平台源码,网站cn域名注册,郑州高校网站建设服务公司完全背包问题及背包问题总结 理论518. 零钱兑换 II322 零钱兑换279. 完全平方数139. 单词拆分(注意遍历顺序) 理论 1、完全背包即在0-1背包问题基础上,一个物品可以选择多次 2、通用解决办法:关键在递推过程 for i in range(len…

完全背包问题及背包问题总结

  • 理论
  • 518. 零钱兑换 II
  • 322 零钱兑换
  • 279. 完全平方数
  • 139. 单词拆分(注意遍历顺序)

理论

1、完全背包即在0-1背包问题基础上,一个物品可以选择多次
2、通用解决办法:关键在递推过程

for i in range(len(weight)):  # 遍历商品for j in range(bagWeight, weight[i]-1, -1):  # 遍历背包容量  从大到小 0-1背包dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
for i in range(len(weight)):  # 遍历商品for j in range(weight[i], bagWeight+1):  # 遍历背包容量  从小到大 完全背包dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

背包问题都是在此基础上的变形:
递推公式:
最多装多少:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); # nums[i]是价值
能否能装满:

  • 思路1:最多装的等于包容量
  • 思路2:True/Falsedp[j] = dp[j] or dp[j - nums[i]]

几种方法:dp[j] = dp[j] + dp[j - nums[i]]
装满背包所有物品的最小个数:dp[j] = min(dp[j], dp[j - nums[i]])

初始化:一维数组一般只需要初始dp[0]

遍历顺序:

  • 0-1背包:
    二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历
    一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。(如果先背包再物品,由于从大到小遍历,最后dp中保留是只放物品0的情况;从大到小是为了防止对数据的覆盖,根本原因是物品只能使用一次)
  • 完全背包:
    如果求组合数就是外层for循环遍历物品,内层for遍历背包。
    如果求排列数就是外层for遍历背包,内层for循环遍历物品。
    注:在一些题目中如果排列数和组合数不影响dp值,则遍历顺序无所谓,例322 零钱兑换

题目
在这里插入图片描述

面试要求:写出代码,分析初始化及遍历顺序


518. 零钱兑换 II

class Solution:def change(self, amount: int, coins: List[int]) -> int:dp = [0]*(amount+1)# dp[j] 在coins[0]-[i]中选择硬币使其和为j的方法数# 初始化dp[0] = 1# 递推for i in range(len(coins)):for j in range(coins[i], amount+1):dp[j] = dp[j] + dp[j-coins[i]]return dp[-1]

注:遍历顺序不可调
先coins后amount得到的是组合数
先amount后coins得到的是排列数

遍历顺序问题参考:
在这里插入图片描述

解释:如果外层遍历的是coins(若coins=2),则在计算dp[j]时只会用到当前即之前的硬币(1,2),不会用到之后的硬币
而如果外层遍历的是amount(若amount=3),则在计算当前dp[j](如coins=2)时必然会使用到之前的dp,而之前的dp是有coins=2之后的硬币5参与的,就是排列数的情况

322 零钱兑换

分析:和上题类似,只是求的是数量,注意理解dp[j]
在递推公式的地方有点变化,若加入当前硬币,硬币数要+1
dp初始化时要设为一个较大的数

class Solution:def coinChange(self, coins: List[int], amount: int) -> int:dp = [amount+1]*(amount+1)  # 硬币数不可能为amount+1  设较大值是由于递推公式求较小# dp[j] : 在0-i内硬币中取,使金额为j的 最少硬币数目# 初始化dp[0] = 0# 递推公式for i in range(len(coins)):for j in range(coins[i], amount+1):dp[j] = min(dp[j], dp[j-coins[i]]+1)  # +1是放入了coins[i]# 输出if dp[-1]==amount+1:return -1else:return dp[-1]# return dp[-1] if dp[-1] < amount + 1 else -1

遍历顺序:这题可以内外层次序调换,不管是组合数还是排列数,硬币数目不变

279. 完全平方数

分析:
完全平方数就是商品可以反复使用——完全背包
要用商品凑满一个容量为n的包
求凑满所需的最少商品数
(和上面的零钱兑换问题一致)

class Solution:def numSquares(self, n: int) -> int:# 计算商品   即为一个数的平方  且我们知道所需的商品最大不超过ngoods = []for m in range(1,101):if m*m>n:breakgoods.append(m*m)# dp[j] 装满大小为n的包需要的最少商品数dp = [n+1]*(n+1)  # 设为较大值由于递推取较小dp[0] = 0# 递推for i in range(len(goods)):for j in range(goods[i], n+1):dp[j] = min(dp[j], dp[j-goods[i]]+1)  # 放入商品 商品数加1return dp[-1]

改进:无需知道商品具体值,即无需算出平方后的量,i**2是商品(python的循环体特性导致无法实现,c可以)

遍历顺序:由于问的是数量,排列或组合对求和的数的数量无影响,所以顺序可调换。

139. 单词拆分(注意遍历顺序)

分析:
商品:worddict中的所有字符串 可重复用——完全背包
背包:字符串s
目标:用商品组合成字符串
dp[j]: 以前i个字符串能否拼接出字符串s的前j个(s[0:j+1]) 注:字符串i始终是末尾字符

递推公式:(TRUE OR FALSE)或的关系

dp[j] = dp[j] or (s[j-len(i):j]==i  and dp[j-len(i)])
    dp[j]:不选字符串i 能否构成strs[j-len(i):j]==i  and dp[j-len(i)]:选字符串i,**前提是s末尾要同字符串i一致**
class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:# 初始化dp = [False]*(len(s)+1)dp[0] =  True# 递推for j in range(len(s)+1):for i in wordDict:if j>=len(i):dp[j] = dp[j] or (s[j-len(i):j]==i  and dp[j-len(i)])print(dp)return dp[-1]

遍历顺序:

“applepenapple”
[“apple”,“pen”]
为例

选择字符串进行组合 2个apple和1个pen有3种
“pen”“apple”“apple”,“apple”“pen”“apple”,“apple”“apple”“pen”
很显然,只有一种最后返回的是True,即强调物品的顺序,所以是排列,而不是组合,要先背包后遍历物品

参考:听说背包问题很难? 这篇总结篇来拯救你了

http://www.15wanjia.com/news/182239.html

相关文章:

  • 如何将网站转成小程序wordpress微站
  • 恒丰建设集团有限公司 网站仙居住房和城乡建设局网站
  • 网页设计制作网站用什么软件wordpress 编辑器 空格
  • 网站开发组合 所有组合餐饮营销策划与运营
  • 做的网站怎么发布到网上网站技术制作流程图
  • 常德网站设计公司湖南省建设厅建筑业信息网
  • 离退休部门网站建设情况网站后台模板论坛
  • 网站建设工资高吗百度竞价设不同网站
  • 苏州建网站必去苏州聚尚网络wordpress文件架构
  • 北京市规划网站wordpress sydney主题
  • pc网站做成移动网站一家网站建设公司需要什么资质
  • iis如何发布asp.net网站wordpress强大吗
  • 环卫公厕建设门户网站访谈创意工作室网站
  • 一个大学网站做的好坏于否的标准网站关键词排名忽然
  • 奢华网站模板望野王绩
  • 沈阳公司网站设计制作建设网站后如何做后台
  • 360网站做二维码2018年做淘宝客网站需要备案嘛
  • 购物网站的建设与维护专题型定制网站建设
  • 红河学院网站建设青岛建网站哪个好
  • 做网站的控件专门做推广的公司
  • 临沂河东区建设局网站龙华区深圳北站
  • 有个能写文章做任务的网站公司起名字库
  • 公明 网站建设哪些公司做网站
  • 中国建设基础设施公司网站深圳正规网站建设公司
  • 优秀购物网站phpcms 视频网站模板下载
  • 专门做搜索种子的网站有哪些洛阳建设银行官方网站
  • 做的好的公司网站公司管理制度
  • 江西做企业网站的公司手机网站友情链接怎么做
  • 上海网站se0优化蛋糕店网站开发策划书
  • 网站平台被骗了怎么办天行健公司网站建设