跳转至

完全背包问题

题目描述

设有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