Powered by:NEFU AB-IN
Link
文章目录
4. 多重背包问题 I
-
题意
-
思路
多重背包:每件物品最多用 s i s_i si件
01背包: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − v [ i ] ] + w [ i ] ) f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]) f[i][j]=max(f[i−1][j],f[i−1][j−v[i]]+w[i])
朴素完全背包: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j − v [ i ] ∗ k ] + k ∗ w [ i ] ) f[i][j] = max(f[i - 1][j - v[i] * k] + k * w[i]) f[i][j]=max(f[i−1][j−v[i]∗k]+k∗w[i]) k = 0 , 1 , 2 , . . . k = 0, 1, 2, ... k=0,1,2,...
优化后的完全背包: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − v [ i ] ] + w [ i ] ) f[i][j] = max(f[i - 1][j], f[i][j - v[i]] + w[i]) f[i][j]=max(f[i−1][j],f[i][j−v[i]]+w[i])
朴素多重背包: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j − v [ i ] ∗ k ] + k ∗ w [ i ] ) f[i][j] = max(f[i - 1][j - v[i] * k] + k * w[i]) f[i][j]=max(f[i−1][j−v[i]∗k]+k∗w[i]) k = 0 , 1 , 2 , . . . s [ i ] k = 0, 1, 2, ... s[i] k=0,1,2,...s[i]相比朴素完全背包,有了取件的限制
-
代码
朴素版本
''' Author: NEFU AB-IN Date: 2022-03-06 11:58:08 FilePath: \ACM\Acwing\4.py LastEditTime: 2022-03-06 12:06:39 ''' n, m = map(int, input().split()) N = 110 v, w, s = [0] * N, [0] * N, [0] * N dp = [[0] * N for _ in range(N)] for i in range(1, n + 1): v[i], w[i], s[i] = map(int, input().split()) for i in range(1, n + 1): for j in range(0, m + 1): #体积从0开始枚举 k = 0 while k <= s[i] and k * v[i] <= j: dp[i][j] = max(dp[i][j], dp[i - 1][j - v[i] * k] + w[i] * k) k += 1 print(dp[n][m])