python多重背包_2020-09-02 Python3 动态规划:背包问题

0-1背包,完全背包,多重背包的个人迭代代码:

from random import randint

class BagProblem(object):

def mv(self,t,v): # One time for each item

if not t or v <=0:

return 0

if t[-1][0]>v:

return 0 if len(t) == 1 else self.mv(t[:len(t)-1],v)

else:

return max(self.mv(t[:len(t)-1],v-t[-1][0])+t[-1][1],

self.mv(t[:len(t)-1],v))

def mv_n(self,t,v): # No limit for each item

if not t or v <=0:

return 0

if t[-1][0]>v:

return 0 if len(t) == 1 else self.mv_n(t[:len(t)-1],v)

else:

return max(self.mv_n(t[:len(t)-1],v-t[-1][0])+t[-1][1],

self.mv_n(t[:len(t)-1],v),

self.mv_n(t,v-t[-1][0])+t[-1][1])

def mv_m(self,t,v): # Multipletimes for each item

if not t or v <=0:

return 0

if t[-1][0]>v:

return 0 if len(t) == 1 else self.mv_m(t[:len(t)-1],v)

elif t[-1][3]>=1:

t[-1][3]-=1

return max(self.mv_m(t[:len(t)-1],v-t[-1][0])+t[-1][1],

self.mv_m(t[:len(t)-1],v),

self.mv_m(t,v-t[-1][0])+t[-1][1])

else:

return max(self.mv_m(t[:len(t)-1],v-t[-1][0])+t[-1][1],

self.mv_m(t[:len(t)-1],v))

def main():

bg = BagProblem()

t=[[2,3],[3,4],[4,5],[5,6]]

v=8

print("One: ", bg.mv(t,v))

t_n=t[:]

for i in range(len(t)):

t_n[i].append(t[i][1]/t[i][0])

t_n.sort(key=lambda x:x[2])

print("No-limited: ", bg.mv_n(t_n,v))

# t_m = [e+[randint(1,3)] for e in t_n]

# print(t_m)

t_m=[[5, 6, 1.2, 3], [4, 5, 1.25, 3], [3, 4, 1.3333333333333333, 3], [2, 3, 1.5, 2]]

print("Multiple: ", bg.mv_m(t_m,v))

if __name__=="__main__":

main()

你可能感兴趣的:(python多重背包)