完全背包问题
题目描述
设有n种物品,每种物品有一个质量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
输入描述
第一行:两个整数,M(背包容量,M≤200)和N(物品数量,N≤30);
第2...N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值
输出描述
仅一行,一个数,表示最大总价值。
样例输入
10 4
2 1
3 3
4 5
7 9
样例输出
12
代码详解
展开查看
#滚动数组实现 M, N = [int(i) for i in input().split()] Wi = [0] Ci = [0] for i in range(1, N+1): ls = [int(i) for i in input().split()] Wi.append(ls[0]) Ci.append(ls[1]) dp = [0 for j in range(M+1)] for i in range(1, N+1): for j in range(1, M+1): if j >= Wi[i]: dp[j] = max(dp[j], dp[j-Wi[i]] + Ci[i]) # for i in range(N+1): # for j in range(M+1): # print(dp[j]) print(dp[M])
运行结果
展开查看
10 4 2 1 3 3 4 5 7 9 12