for i <- 1 to n: for j <- 1 to m: for k <- 0 to s[i] and k * v[i] <= j: f[i][j] = max(f[i - 1][j], f[i - 1][j - k * v[i]] + k * w[i])
Python 实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
N = 1010 dp, v, w, s = [[0]*N for _ in range(N)], [0]*N, [0]*N, [0]*N
defmain(): n, m = map(int, input().split()) 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(1, m + 1): k = 0 while k <= s[i] and k * v[i] <= j: dp[i][j] = max(dp[i][j], dp[i - 1][j - k * v[i]] + k * w[i]) k += 1
# 应为数据范围是N <= 1000, M <= 2000 所以做01背包的时候就是 N * M * log(M) ~= 20000多, 数据N = 25000 就不会超掉 N = 25000 dp = [0]*N v = [0]*N w = [0]*N
defmain(): n, m = map(int, input().split()) cnt = 0 for i in range(1, n + 1): a, b, c = map(int, input().split()) temp = 1 while temp <= c: cnt += 1 v[cnt] = temp * a w[cnt] = temp * b c -= temp temp *= 2
if c > 0: cnt += 1 v[cnt] = c * a w[cnt] = c * b
for i in range(1, cnt + 1): for j in range(m, v[i] - 1, -1): dp[j] = max(dp[j], dp[j - v[i]] + w[i])