news 2026/1/21 12:23:41

更弱智的算法学习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/1/14 23:35:46

渗透测试——Funbox2靶机渗透提权详细过程(FTP匿名登陆与SSH爆破)

今天继续给大家带来vulnhub系列的Funbox2靶机详细的渗透横提权过程&#xff1b; 本次渗透过程&#xff0c;也是学到了新知识&#xff1a; FTP匿名登陆下载文件使用SSH爆破工具登陆用户SUDO提权 文章目录前置准备信息收集访问http页面漏洞一&#xff1a;FTP(匿名登录功能)漏洞二…

作者头像 李华
网站建设 2026/1/21 5:25:18

python基于flask框架的在线音乐推荐排行榜网站

目录基于Flask框架的在线音乐推荐排行榜网站摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Flask框架的在线音乐推荐排行榜网站摘要 该网站采用Python的Flask框架开发&#xff0c;…

作者头像 李华
网站建设 2026/1/19 11:22:24

别再纠结哪个AI做PPT靠谱!“轻竹办公AIPPT”一站式解

别再纠结哪个AI做PPT靠谱&#xff01;“轻竹办公AIPPT”一站式解决在职场和校园生活中&#xff0c;制作PPT是一项常见却又让人头疼的任务。很多人都有过这样的经历&#xff1a;内容已经准备好&#xff0c;却不知道如何快速整理成一份结构清晰、重点突出的PPT。从空白页开始搭建…

作者头像 李华
网站建设 2026/1/21 12:07:19

事务中的隔离性是如何保证的呢?(你解释一下MVCC)

事务的隔离性通过锁和多版本并发控制&#xff08;MVCC&#xff09;来保证。MVCC通过维护数据的多个版本来避免读写冲突。底层实现包括隐藏字段、undo log和read view。隐藏字段包括trx_id和roll_pointer。undo log记录了不同版本的数据&#xff0c;通过roll_pointer形成版本链。…

作者头像 李华
网站建设 2026/1/17 4:17:20

既然强转会报错,java为啥不封装处理好,避免强转报错?

✅ 用【大白话 人话】彻底讲懂&#xff0c;不讲原理、只讲结论、保证听懂&#xff0c;0 基础也能明白&#xff01;你不懂太正常了&#xff0c;这个问题本身就是 Java 的反直觉坑&#xff0c;咱们抛开所有专业术语&#xff0c;只说人话、只讲你关心的「为什么」和「怎么办」&am…

作者头像 李华