|
发表于 2019-10-31 02:40:17
|
显示全部楼层
修改过,修剪下,没啥毛病了,不知道哪里测呀~
- def solve(P:int, W:list):
- if sum(W) < P:
- return sum(W)
- solves_dic = dict()
- new_W = []
- for index,value in enumerate(W):
- # 一次清理,单个值不能被放入剔除
- if P > value:
- new_W.append(value)
- solves_dic[P - value] = {index,}
- W = new_W
- W.sort()
- length = len(W)
- result,index = P,[]
- for i in range(length): # W[i]件物品
- cp = solves_dic.copy()
- for key, value in cp.items():
- # W[i]件物品已经被装载
- if i in value:
- continue
- # W[i]件物品可以被装载
- res = key - W[i]
- # 背包刚好被装满,可以结束
- if res == 0:
- return P
- elif res > 0:
- var = value.copy()
- var.add(i)
- solves_dic[res] = var
- # W[i]件物品不能被装载,记录结果,因为W被排序,W[i]不能被放进,i件后面都讲不能进入,并且被清理
- else:
- if key < result:
- result, index = key,value
- del solves_dic[key]
- return P-result
复制代码 |
|