我写了个有局限性的函数,但目前没发现能让它出错的输入数据,所以我就发出来了:
- def load(m:int,A:'list')->int:
- tot = 0
- A.sort(reverse=True)#确定从大到小的顺序
- length = len(A)
- for i in range(length):#左边界渐渐向右逼近
- sums = 0
- for j in A[i:]:
- sums += j
- if sums == m:#背包能够被装满,直接输出背包容量
- return m
- elif m > sums > tot:#在不超过背包容量的前提下,尽可能的装载
- tot = sums
- elif sums > m:#装了这个大件就超过了容量,所以不装
- sums -= j
- if sums < tot:#无法再创新高
- break
- return tot
- if __name__ == '__main__':
- print('示例1 输出:',load(10,[3,4,8,5]))
- print('示例2 输出:',load(12,[2,3,5,7]))
- print('大数据?输出:',load(m = 5000, A = [828,125,740,724,983,321,773,678,841,842,875,377,674,144,340,467,625,916,463,922,255,662,692,123,778,766,254,559,480,483,904,60,305,966,872,935,626,691,832,998,508,657,215,162,858,179,869,674,452,158,520,138,847,452,764,995,600,568,92,496,533,404,186,345,304,420,181,73,547,281,374,376,454,438,553,929,140,298,451,674,91,531,685,862,446,262,477,573,627,624,814,103,294,388]))
复制代码
因为我自己不是很确定,所以稍微改了改,让输出包含了最多能装的、和怎么装能装这么多
- def load(m:int,A:'list')->tuple:
- tot = 0
- who = []
- A.sort(reverse=True)#确定从大到小的顺序
- length = len(A)
- for i in range(length):#左边界渐渐向右逼近
- sums = 0
- adds = []
- for j in A[i:]:
- sums += j
- adds.append(j)
- if sums == m:#背包能够被装满,直接输出背包容量
- return (m,adds)
- elif m > sums > tot:#在不超过背包容量的前提下,尽可能的装载
- tot = sums
- who = adds
- elif sums > m:#装了这个大件就超过了容量,所以不装
- sums -= j
- adds.pop()
- if sums < tot:#无法再创新高
- break
- return (tot,who)
- if __name__ == '__main__':
- print('示例1 输出:',load(10,[3,4,8,5]))
- print('示例2 输出:',load(12,[2,3,5,7]))
- print('大数据?输出:',load(m = 5000, A = [828,125,740,724,983,321,773,678,841,842,875,377,674,144,340,467,625,916,463,922,255,662,692,123,778,766,254,559,480,483,904,60,305,966,872,935,626,691,832,998,508,657,215,162,858,179,869,674,452,158,520,138,847,452,764,995,600,568,92,496,533,404,186,345,304,420,181,73,547,281,374,376,454,438,553,929,140,298,451,674,91,531,685,862,446,262,477,573,627,624,814,103,294,388]))
复制代码 |