n,W = 4,5 w,v = [2,1,3,2],[3,2,4,2] defrecord(i,j): res = 0 if i == n: res = 0 elif j < w[i]: res = record(i+1,j) else: res = max(record(i+1,j),record(i+1,j-w[i])+v[i]) return res print(record(0,W))
n,W = 4,5 w,v = [2,1,3,2],[3,2,4,2] d = [[-1for i inrange(W+1)] for j inrange(n+1)] #-1表示标记 defrecord(i,j): res = 0 if d[i][j] >= 0: return d[i][j] elif i == n: res = 0 elif j < w[i]: res = record(i+1,j) else: res = max(record(i+1,j),record(i+1,j-w[i])+v[i]) d[i][j] = res return d[i][j] print(record(0,W))
动态规划
二维列表dp根据状态转移函数的定义可以变化成如下递推公式:
dp[n][j]= 0
dp[i][j] = dp[i+1][j] (j<w[i])
max(dp[i+1][j]+ dp[i+1][j-w[i]]+v[i]) 其他
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
n,W = 4,5 w,v = [2,1,3,2],[3,2,4,2] dp = [[-1for i inrange(W+1)] for j inrange(n+1)] #初始化dp[n][j] = 0 for index inrange(W+1): dp[n][index] = 0 defDP(): i = n-1 while i >= 0: for j inrange(W+1): if j < w[i]: dp[i][j] = dp[i+1][j] else: dp[i][j] = max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]) print(dp[i][j]) i -= 1 print(dp[0][W]) DP()