算法题总结-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])
posted @ 2023-06-09 16:38  356a  阅读(30)  评论(0编辑  收藏  举报