栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【最全背包九讲】

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【最全背包九讲】

前言

搜了一下发现网上python类的背包问题讲的不太清楚,于是打算自己写一份详细有注释的。

一、背包九讲 动规五部曲

先介绍动态规划类的五部曲

  1. 确定dp数组以及下标的含义:
  2. 确定递推公式
  3. 初始化
  4. 确定遍历顺序,哪个在内哪个在外,顺序还是倒叙遍历
  5. 举例验证。
二、0/1背包
  1. 0/1背包采用外层物品,内层循环背包。
  2. 我们使用了一维数组代替二维数组,由于背包每个物品只能放一次,所以内层背包循环必须逆序。
1.最值类问题
#weight表示
for i in range(len(weight)):
    for j in range(bag_weight, weight[i] - 1, -1):
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
2.组合数

题目目标和,指路

bagSize = (sumValue + target) // 2
dp = [0] * (bagSize + 1)
dp[0] = 1
for i in range(len(nums)):
    for j in range(bagSize, nums[i] - 1, -1):
        dp[j] += dp[j - nums[i]]
return dp[bagSize]
3.bool类
#分割子集和,是一个对错问题
dp=[False]*(t+1)
dp[0]=True
for i in range(len(nums)):
    for j in range(t,nums[i]-1,-1):
        dp[j]=dp[j] or dp[j-nums[i]]
4.一和零

二维数组

dp = [[0] * (n + 1) for _ in range(m + 1)]	# 默认初始化0
# 遍历物品
for str in strs:
    ones = str.count('1')
    zeros = str.count('0')
    # 遍历背包容量且从后向前遍历!
    for i in range(m, zeros - 1, -1):
        for j in range(n, ones - 1, -1):
            dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1)
return dp[m][n]
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/829805.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号