算法题总结-01背包问题
原题
有N件物品和一个容量为V的背包。第i件物品的价值是C[i],重量是W[i]。求解将哪些物品装入背包可使价值总和最大。
输入描述:
输入第一行数 N V (1 <=N <=500) (1<= V <= 10000)
输入 N行 两个数字 代表 C W (1 <= C <= 50000, 1 <= W <=10000)
输入示例:
5 10
8 6
10 4
4 2
5 4
5 3
输出示例:
19
01背包问题基本可以用一句话描述,i件物品中挑选若干不重复放入容量V的背包中,使得价值最大
核心转移方程为
F[i][v] = max(F[i-1][v],F[i − 1, v − Wi] + Ci)
方程就一个意思,i件物品的最大价值,可以划分为 i-1件物品的最大价值,再放一件物品 或者 不再放物品
注意事项:
1、逐个物品遍历,降序遍历容量(确保每个物品在每个容量的情况下仅取一次),每个容量求解最优解
import sys
count=0
N = 0
V = 0
c = []
w = []
for line in sys.stdin:
single = line.strip().split(" ")
if count==0:
N = int(single[0])
V = int(single[1])
pass
elif count<=N:
c.append(int(single[0]))
w.append(int(single[1]))
pass
else:
break
count+=1
pass
# F[i, v] = max{F[i − 1, v], F[i − 1, v − Ci] + Wi}
F = [0 for i in range(V+1)]
for i in range(N):
for volume in range(V, -1, -1):
v_tmp = volume-w[i]
if v_tmp<0:
continue
F[volume] = max(F[volume],F[v_tmp]+c[i])
pass
pass
print(F[V])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通