news 2026/5/19 18:57:04

更弱智的算法学习day 37

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
更弱智的算法学习day 37

完全背包

完全背包问题和01背包的区别主要在“物品可以重复添加”这里。在代码上的区别只有,可以重复选择一个物品;也正是我们在01背包里要注意的,可以选择一个物品,也即内存循环可以从前往后遍历

# 输入 n, bag_weight = map(int, input().split()) weight = [] value = [] for _ in range(n): w, v = map(int, input().split()) weight.append(w) value.append(v) dp = [0] * (bag_weight+1) for i in range(0,n): for j in range(0,bag_weight+1): if j >= weight[i]: dp[j] = max(dp[j] , dp[j-weight[i]]+ value[i]) print(dp[bag_weight])

518. 零钱兑换 II

dp函数的意义:

对应dp[amount]而言,其意义是:当还需要amount面额需要补充时,存在能凑成amount的金额的硬币组合数。

状态转移方程:

也即存在选或不选两种情况:

不选i:dp[i] = dp[i]

选了i:dp[i] = dp[i-1]

因此 dp[j] += dp[j-i]

遍历顺序:

因为是完全背包问题,因此先遍历硬币,在遍历金额,顺序遍历

初始化:

由于金额为0时,有1中选择方法,也即全不选。故dp[0]=1

class Solution: def change(self, amount: int, coins: List[int]) -> int: dp = [0]*(amount+1) dp[0] = 1 for i in coins: for j in range(i, amount+1): dp[j] += dp[j-i] return dp[amount]

377. 组合总和 Ⅳ

dp函数的意义:

对应dp[target]而言,其意义是:存在一个目标整数target时,从nums中找出的元素排列个数为dp[target]个

状态转移方程:

也即存在选或不选两种情况:

不选i:dp[i] = dp[i]

选了i:dp[i] = dp[i-1]

因此 dp[j] += dp[j-i]

遍历顺序:

因为是完全背包问题,且是求排列数,因此先便利整数,在遍历数组从而实现顺序不同也可以保存下来

初始化:

因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。

dp[0]=1

class Solution: def combinationSum4(self, nums: List[int], target: int) -> int: dp = [0] * (target+1) dp[0] = 1 for j in range(1, target+1): for i in nums: if j >= i: dp[j] += dp[j-i] return dp[target]

70. 爬楼梯 (进阶)

dp函数的意义:

对应dp[n]而言,其意义是:存在一个台阶数n时,从m中找出的楼梯排列个数为dp[n]个

状态转移方程:

也即存在选或不选两种情况:

不选i:dp[i] = dp[i]

选了i:dp[i] = dp[i-1]

因此 dp[j] += dp[j-i]

遍历顺序:

因为是完全背包问题,且是求排列数,因此先便利总数,在遍历数组从而实现顺序不同也可以保存下来

初始化:

因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。

dp[0]=1

n,m = map(int, input().split()) dp = [0] * (n+1) dp[0] = 1 for j in range(1,n+1): for i in range(1,m+1): if i <= j: dp[j] += dp[j-i] print(dp[n])
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 15:41:16

成都移动直连中国香港公网线路

成都移动直连中国香港公网线路 摘要 在不考虑IEPL、IPLC等国际专线的情况下&#xff0c;成都移动用户连接中国香港的公网线路选择对网络性能至关重要。本文通过深入的路由分析、性能测试和成本评估&#xff0c;系统对比CMIv2、CMIv1及各类绕路方案的技术特性&#xff0c;为成都…

作者头像 李华
网站建设 2026/5/19 15:55:15

java学习--LinkedList

一、LinkedList 是什么&#xff1f;LinkedList 是 Java 集合框架中 java.util 包下的一个实现类&#xff0c;它实现了 List、Deque 等接口&#xff0c;底层基于双向链表实现&#xff08;JDK 1.6 及之前是循环链表&#xff0c;之后改为双向链表&#xff09;。简单来说&#xff1…

作者头像 李华
网站建设 2026/5/13 18:04:50

TVS管并联提升通流为何反而导致钳位不稳?

在车载与工业电源设计中&#xff0c;工程师常通过并联TVS管提升通流能力以应对高强度浪涌。然而工程实测数据显示&#xff0c;简单并联往往导致钳位电压剧烈波动、器件提前失效&#xff0c;甚至保护功能完全丧失。问题根源在于TVS的半导体特性与电路寄生参数的深度耦合。 一、击…

作者头像 李华
网站建设 2026/5/15 15:24:24

1986-2023年并购SDC数据库数据

并购SDC数据库通过收集、整理和分析并购交易数据&#xff0c;为学术研究、企业战略决策、投资分析等提供关键数据支持。 收录了自1986年以来全球范围内的并购、收购、资产剥离等各类交易信息。该数据库提供交易金额、支付方式、溢价水平、双方财务数据及行业分类等丰富指标。 …

作者头像 李华
网站建设 2026/5/12 7:25:12

python基于flask框架的在线编程学习系统设计与实现

目录基于Flask框架的在线编程学习系统设计与实现摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Flask框架的在线编程学习系统设计与实现摘要 该系统采用Python语言与Flask轻量级框…

作者头像 李华