跟同事聊,他面试的时候被问到背包问题,问我知道这个问题嘛,我说知道,但是说来惭愧,之前看过动态规划的东西,后面又全忘记了,所以又去学习了下背包问题的解题思路。
看了几篇博文,发现有一篇写的不错,所以先列上
https://www.jianshu.com/p/a66d5ce49df5
参照这篇博文,将其java代码改成python代码,记录下
import numpy as np
def solve(vlist,wlist,totalWeight,totalLength):
resArr = np.zeros((totalLength,totalWeight),dtype=np.int32)
print(resArr)
for i in range(0,totalLength):
for j in range(1,totalWeight+1):
if i == 0:
if wlist[i] <=j:
resArr[i][j - 1] = vlist[i]
else:
resArr[i][j - 1] = 0
else:
if wlist[i] < j:
resArr[i,j-1] = max(resArr[i-1,j-wlist[i]-1]+vlist[i],resArr[i-1,j-1])
elif wlist[i] == j:
resArr[i, j - 1] =max(vlist[i],resArr[i-1,j-1])
else:
resArr[i,j-1] = resArr[i-1,j]
print(resArr)
return resArr[-1,-1]
if __name__ == '__main__':
# 物品的价值列表
v = [1500,3000,2000,2000]
# 物品的重量列表
w = [1,4,3,1]
weight = 4
n = 4
result = solve(v,w,weight,n)
print(result)