查看“Knapsack”的源代码
←
Knapsack
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看和复制此页面的源代码。
[[Category:动态规划]] 背包问题,使用动态规划求解。 有 ''num'' 个物品和容量为 ''weight'' 的背包,每个物品都有自己的体积 ''w'' 和价值 ''v'',求拿哪些物品可以使得背包所装下物品的总价值最大。如果限定每种物品只能选择 0 或 1 个,则为 0-1 背包问题;如果不限定每种物品的数量,则为无界背包问题或完全背包问题。 == 0-1 背包 == 每件物品只能选择拿或不拿。使用二维数组,<code>dp[i][j]</code> 表示前 i 件物品体积不超过 j 的情况下能达到的最大价值。状态转移方程为 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w] + v) (if j >= w) dp[i-1][j] (if j < w) 可以进行空间优化,使用一维的 <code>dp</code> 数组,内层需要逆向遍历。 <syntaxhighlight lang=python> def knapsack(weights: list[int], values: list[int], int weight_goal): dp = [0 for _ in range(w + 1)] for w in weights: for j in reversed(range(w, weight_goal + 1)): # ^^^ 逆向遍历 dp[j] = max(dp[j], dp[j-w] + values[i]) return dp[weight_goal] </syntaxhighlight> == 完全背包 ==
返回至
Knapsack
。
导航菜单
个人工具
登录
名字空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息