以算法图解中的例子为例,为理解方便,建立了path类,这样能够直接输出装了哪些东西.
1.基础版算法(开个二维数组)
'''
guitar: 1 1500
computer: 3 2000
sound: 4 3000
'''
from dataclasses import dataclass,field
from copy import deepcopy
@dataclass
class goods:
name:str=field(default='non')
weight:int=0
value:int=0
@dataclass
class path:
goods:list=field(default_factory=list)
weight:int=0
value:int=0
def appends(self,good):
self.goods.append(good)
self.weight+=self.goods[-1].weight
self.value += self.goods[-1].value
N=3 #3种商品
M=4 #背包总容量为4
goodsList=[goods('non'),goods('guitar',1,1500),goods('computer',3,2000),goods('sound',4,3000)]
knapsack=[[path() for i in range(M+1)] for i in range(N+1)]
#压缩为1维
for i in range(1,N+1):#以所有0作为边界
for j in range(goodsList[i].weight,M+1):
if knapsack[i-1][j].value > knapsack[i-1][j-goodsList[i].weight].value+goodsList[i].value:
knapsack[i][j]=deepcopy(knapsack[i-1][j])
else:
knapsack[i][j]=deepcopy(knapsack[i-1][j-goodsList[i].weight])
knapsack[i][j].appends(goodsList[i])
print(knapsack[-1][-1])
print('end')
输出为:
path(goods=[goods(name='guitar', weight=1, value=1500), goods(name='computer', weight=3, value=2000)], weight=4, value=3500)
2. 压缩为1维
'''
guitar: 1 1500
computer: 3 2000
sound: 4 3000
'''
from dataclasses import dataclass,field
from copy import deepcopy
@dataclass
class goods:
name:str=field(default='non')
weight:int=0
value:int=0
@dataclass
class path:
goods:list=field(default_factory=list)
weight:int=0
value:int=0
def appends(self,good):
self.goods.append(good)
self.weight+=self.goods[-1].weight
self.value += self.goods[-1].value
N=3 #3种商品
M=4 #背包总容量为4
goodsList=[goods('non'),goods('guitar',1,1500),goods('computer',3,2000),goods('sound',4,3000)]
knapsack=[path() for i in range(M+1)]
count=0
#01二维
for i in range(1,N+1):#以所有0作为边界
for j in range(M,goodsList[i].weight-1,-1):
if knapsack[j].value<=knapsack[j-goodsList[i].weight].value+goodsList[i].value:
knapsack[j]=deepcopy(knapsack[j-goodsList[i].weight])
knapsack[j].appends(goodsList[i])
print(knapsack[-1])
print('end')
输出为:
path(goods=[goods(name='guitar', weight=1, value=1500), goods(name='computer', weight=3, value=2000)], weight=4, value=3500)
end
如有错误欢迎指正