背包问题:
有n种物品,每种物品重量和价值分别为w[i],v[i],若背包重量限制为b,每种物品可放多个,求max value的物品放法
#coding=utf-8
'''
设第i种物品放x[i]个,假设先取前k种物品,分配给前k种物品的重量为x,
F[k][x]为可得到的max value, i[k][x]为标记位
'''
import numpy as np
def knapsack(n,b,w,v):
F = np.zeros((n,b+1))
I = np.zeros((n,b+1))
# initialize F,i when x==0
for i in range(n):
F[i][0] = 0
I[i][0] = -1
for k in range(0,n):
for x in range(1,b+1):
if (x-w[k]>=0)and(k-1>=0):
if F[k-1][x] > F[k][x-w[k]]+v[k]:
F[k][x] = F[k-1][x]
I[k][x] = I[k-1][x]
else:
F[k][x] = F[k][x-w[k]] + v[k]
I[k][x] = k
elif k-1>=0:
F[k][x] = F[k-1][x]
I[k][x] = I[k-1][x]
elif x-w[k]>=0:
F[k][x] = F[k][x-w[k]] + v[k]
I[k][x] = k
else:
F[k][x] = 0
return F[n-1][b], I
def track_solution(n,b,w,I):
x = I[n-1,b]
rest_b = b
ls_solution = np.zeros(n)
while (rest_b>0) :
ls_solution[int(x)] += 1
rest_b = rest_b-w[int(x)]
x = I[int(x),int(rest_b)]
return ls_solution
if __name__=='__main__':
v = [1,3,5,9]
w = [2,3,4,7]
b = 10
n = 4
F,I = knapsack(n,b,w,v)
ls = track_solution(n,b,w,I)
print (F,ls)