[背包笔记Python版] 01背包问题

以算法图解中的例子为例,为理解方便,建立了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

如有错误欢迎指正

猜你喜欢

转载自blog.csdn.net/ftimes/article/details/120017202