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

温州门户网站网站商城app建设方案

温州门户网站,网站商城app建设方案,wordpress 显示时间,免费追漫软件app刷完这个系列的经验之谈 分为三类 1、求最值(最大价值、最小长度)——对应这的理论基础与lc322零钱兑换 2、求组合——对应lc518零钱兑换 3、求排列——对应lc377组合总和IV、lc57爬楼梯进阶 遍历顺序: 最值:可以颠倒&#…

刷完这个系列的经验之谈

分为三类

1、求最值(最大价值、最小长度)——对应这的理论基础与lc322零钱兑换

2、求组合——对应lc518零钱兑换

3、求排列——对应lc377组合总和IV、lc57爬楼梯进阶

遍历顺序:

最值:可以颠倒,因为最后都是最值更新,不会重复计算组合

组合:只能是先物品-后背包,否则会重复计算组合

排列:只能是先背包-后物品,否则漏掉排列(排列问题一律看作爬楼梯

完全背包基础理论题

完全背包就是每个物品的数量是不限的,可以多次选择。

二维来看,核心区别就是动态转移方程的改变:

        dp[i][j] = max(dp[i-1][j], dp[i][j-weights[i]])

        1、不选i,为dp[i-1][j](这点与0-1背包无区别)

        2、选i,但之前还可以选过i,则为dp[i][j-weights[i]],而非dp[i-1][j-weights[i]]

一维来看,就是遍历顺序改变了,因为每一行都要根据当前行的左侧状态进行转移,所以就是顺序遍历

二维方法

import sys
input = sys.stdin.read
data = input().split()
index = 0
n = int(data[index])
index += 1
v = int(data[index])
index += 1
weights = []
values = []
for _ in range(n):weights.append(int(data[index]))index += 1values.append(int(data[index]))index += 1#dp[i][j]:选择【0-i】物品,容量为j的背包最大价值为dp[i][j]
#dp[i][j] = max(dp[i-1][j], dp[i][j-weights[i]]+values[i])
#求解dp[n-1][v]#初始化
dp = [[0] * (v+1) for _ in range(n)]
for j in range(weights[0], v+1):dp[0][j] = dp[0][j-weights[0]] + values[0]for i in range(1, n):for j in range(1, v+1):if j < weights[i]:dp[i][j] = dp[i-1][j]else:dp[i][j] = max(dp[i-1][j], dp[i][j-weights[i]]+values[i])
print(dp[n-1][v])

一维方法

import sys
input = sys.stdin.read
data = input().split()
index = 0
n = int(data[index])
index += 1
v = int(data[index])
index += 1
weights = []
values = []
for _ in range(n):weights.append(int(data[index]))index += 1values.append(int(data[index]))index += 1#dp[j]:容量为j的背包最大价值为dp[j]
#dp[j] = max(dp[j], dp[j-weights[i]]+values[i])
#求解dp[v]
dp = [0] * (v+1)#遍历——左to右
for i in range(n):for j in range(weights[i], v+1):dp[j] = max(dp[j], dp[j-weights[i]]+values[i])
print(dp[v])

lc518 零钱兑换

注意这是组合问题,而非排列问题,所以遍历顺序很重要,一定要先遍历物品

遍历物品:

        对于每个物品都是按顺序遍历的,所以物品i+1不会出现在i之前,这就避免了重复组合

二维方法

class Solution:def change(self, amount: int, coins: List[int]) -> int:#dp[i][j]:用【0-i】钱币装满容量为j的背包组合数为dp[i][j]#dp[i][j] = dp[i-1][j] + dp[i][j-coins[i]]#求解dp[n-1][amount]n = len(coins)dp = [[0] * (amount+1) for _ in range(n)]#初始化for i in range(n):dp[i][0] = 1for j in range(amount+1):if j % coins[0] == 0:dp[0][j] = 1#遍历for i in range(1, n):for j in range(1, amount+1):if j < coins[i]:dp[i][j] = dp[i-1][j]else:dp[i][j] = dp[i-1][j] + dp[i][j-coins[i]]return dp[n-1][amount]

一维方法

class Solution:def change(self, amount: int, coins: List[int]) -> int:#dp[j]:容量为j的背包被装满的组合数为dp[j]#dp[j] = dp[j] + dp[j-coins[i]]#求解dp[amount]dp = [0] * (amount+1)dp[0] = 1for i in range(len(coins)):for j in range(coins[i], amount+1):dp[j] = dp[j] + dp[j-coins[i]]return dp[amount]

lc377 组合总和IV(看作爬楼梯)(求的是排列 排列 排列!!!!!!!!!!)
 

二维方法(不好理解,可以不看)

dp数组含义变了(注释)

dp[i][j] = dp[i-1][j] + dp[-1][j-nums[i]]

        不选i:dp[i-1][j]

        选i:之前的排列要考虑到所有物品,而不能只考虑【0, i-1】物品,所以为dp[-1][j-num[i]]
        最后一行是考虑了所有物品的排列可能的

特殊处理i==0这种情况,不然i-1为-1时转移不合理。

class Solution:def combinationSum4(self, nums: List[int], target: int) -> int:#dp[i][j]:最后一个考虑(选or不选)的物品为i,装满容量为j的背包的排列数为dp[i][j]#dp[i][j] = dp[i-1][j] + dp[-1][j-nums[i]]#求解dp[n-1][target]n = len(nums)dp = [[0] * (target+1) for _ in range(n)]#初始化for i in range(n):dp[i][0] = 1#遍历for j in range(1, target+1):for i in range(n):if i == 0:if j < nums[i]:dp[i][j] = 0else:dp[i][j] = 0 + dp[-1][j-nums[i]]else:if j < nums[i]:dp[i][j] = dp[i-1][j]else:dp[i][j] = dp[i-1][j] + dp[-1][j-nums[i]]return dp[n-1][target]

一维方法

可以看作爬楼梯问题

dp[j]:爬上j阶楼梯的走法有dp[j]种,每次面临nums个选择

则dp[j]完全由dp[j-nums[i]]的总和决定

class Solution:def combinationSum4(self, nums: List[int], target: int) -> int:n = len(nums)#dp[j] : 装满容量为j的背包的排列数为dp[j]#dp[j] = dp[j] + dp[j-nums[i]]#求解dp[target]dp = [0] * (target+1)dp[0] = 1for j in range(target+1):for i in range(n):if j >= nums[i]:dp[j] = dp[j] + dp[j-nums[i]] return dp[target]

lc57 爬楼梯进阶

dp[j]:爬上j阶楼梯的走法有dp[j]种,每次面临nums个选择

则dp[j]完全由dp[j-nums[i]]的总和决定

import sys
input = sys.stdin.read
data = input().split()
index = 0
n = int(data[index])
index += 1
m = int(data[index])
#dp[j] : 容量为j的背包装满的排列数为dp[j]
#dp[j] = dp[j] + dp[j-i]
#求解dp[n]
dp = [0] * (n+1)
dp[0] = 1#遍历
for j in range(1, n+1):for i in range(1, m+1):if j >= i:dp[j] = dp[j] + dp[j-i]
print(dp[n])

lc322 零钱兑换

因为是选取最小值,所以初始化为最大值

二维方法

class Solution:def coinChange(self, coins: List[int], amount: int) -> int:#dp[i][j]:使用【0-i】硬币,装满容量为amount的背包,使用的最少硬币数为dp[i][j]#dp[i][j] = min(dp[i-1][j], dp[i][j-coins[i]]+1)#求解dp[n-1][amount]n = len(coins)dp = [[float('inf')] * (amount+1) for _ in range(n)]for i in range(n):dp[i][0] = 0for j in range(1, amount+1):if j % coins[0] == 0:dp[0][j] = j // coins[0]for i in range(1, n):for j in range(1, amount+1):if j < coins[i]:dp[i][j] = dp[i-1][j]else:dp[i][j] = min(dp[i-1][j], dp[i][j-coins[i]]+1)if dp[n-1][amount] == float('inf'):return -1return dp[n-1][amount]

一维方法

class Solution:def coinChange(self, coins: List[int], amount: int) -> int:#dp[j] : 装满容量为j的背包,最少的硬币数目为dp[j]#dp[j] = min(dp[j], dp[j-coins[i]]+1)#求解dp[amount]n = len(coins)#初始化dp = [float('inf')] * (amount+1)dp[0] = 0for i in range(n):for j in range(coins[i], amount+1):dp[j] = min(dp[j], dp[j-coins[i]]+1)if dp[amount] == float('inf'):return -1return dp[amount]

lc279 完全平方数

class Solution:import mathdef numSquares(self, n: int) -> int:#dp[j] : 容量为j的背包装满的最小长度为dp[j]#dp[j] = min(dp[j], dp[j-num]+1)#求解dp[n]#初始化dp = [float('inf')] * (n+1)dp[0] = 0for i in range(1, int(math.sqrt(n)+1)):for j in range(i**2, n+1):dp[j] = min(dp[j], dp[j-i**2]+1)return dp[n]

lc139 单词拆分

排列问题就用“爬楼梯思想”

class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:wordDict = set(wordDict)n = len(s)#dp[j]: j阶楼梯能否爬上,即s【0 : j】能否成功构造#dp[j] 由 dp[j-k]决定,即从当前s[j-1]开始往前搜,看是否存在于set,且之前的台阶能否够上#求解dp[n]dp = [False] * (n+1)dp[0] = Truefor j in range(1, n+1):for k in range(j, -1, -1):if s[k-1 : j] in wordDict and dp[k-1] == True:dp[j] = Truereturn dp[n]


文章转载自:

http://PxNFOoaS.pqnkg.cn
http://rY97T5qd.pqnkg.cn
http://GC0Ar4mS.pqnkg.cn
http://GaHreGFU.pqnkg.cn
http://xQZsMdox.pqnkg.cn
http://wgmDEAwA.pqnkg.cn
http://YqnYExWm.pqnkg.cn
http://50IDFu2x.pqnkg.cn
http://6Aslmaw8.pqnkg.cn
http://dDBUhqhn.pqnkg.cn
http://rz2cPaNe.pqnkg.cn
http://1vLgpRhQ.pqnkg.cn
http://6NDQFEuD.pqnkg.cn
http://IYySfhYa.pqnkg.cn
http://ObJPEbax.pqnkg.cn
http://4JoHTn6Y.pqnkg.cn
http://iUJVR4kq.pqnkg.cn
http://J7Pdw1nl.pqnkg.cn
http://rSjp9HuA.pqnkg.cn
http://N1UHU7mr.pqnkg.cn
http://R0piqtHB.pqnkg.cn
http://M2NkmlGt.pqnkg.cn
http://tGAf391d.pqnkg.cn
http://T5Ul6oZq.pqnkg.cn
http://sgElUuBN.pqnkg.cn
http://2nIV25cF.pqnkg.cn
http://i4WguXBj.pqnkg.cn
http://OC7HhYHx.pqnkg.cn
http://AuvvnKGe.pqnkg.cn
http://TCsDElhK.pqnkg.cn
http://www.dtcms.com/wzjs/736193.html

相关文章:

  • 高唐做网站爱站网长尾词挖掘
  • 芜湖网站建设求职简历WordPress中文替换布
  • 咸阳建设局网站深圳建站程序
  • 企业如何做网站建站seo优化一般包括
  • 资阳自贡网站建设平台静态网站模板古典
  • 大连网站快速制作xp系统没有lls组件可以做网站吗
  • 做网站后有人抢注品牌关键字h5商城网站建设是什么
  • 海沧建设局网站在线网站生成器
  • 网站建设 提升和扩大北京代理记账公司电话
  • 做网站的盈利点做直播大秀的平台和网站
  • ps网站首页设计图大型公司办公室设计
  • 网站建设规划书范文5000字中国app开发公司排名
  • 中建国际建设有限公司官网是央企吗重庆网站优化公司怎么样
  • 用网页采集个人信息网站怎么做商贸公司起名大全最新
  • 网站内页的设计怎么用ps切片在dw里做网站
  • 达浒镇网站建设公司可视化拖拽网站建设软件
  • 网站左侧漂浮导航app主题WordPress
  • 天猫优惠卷怎么做网站佛山智家人网站
  • 专业南京网站建设数控编程培训
  • 广东官方网站建设中国体育新闻最新消息
  • 烟台专业网站制作公司南京广告公司
  • 做网站和app哪个难移动互联网开发的特点
  • 平湖市网站建设php做网站 价格
  • 深圳宝安医院的网站建设网站服务器提供什么服务
  • 银川市住房和城乡建设网站外贸网站制作推广公司
  • 商城网站策划方案爬知乎文章做网站
  • 怎么制作免费的企业网站网站搭建协议
  • 程序员自己做网站怎么赚钱昆明网站建设8888168
  • 我爱做衣服网站做网站温州
  • 建设企业网站方案营销推广活动策划方案大全