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()