from typing import (
List,
)
import time
def weight_capacity(weights: List[int], max_capacity: int) -> int:
for b in weights:
if b>max_capacity:
weights.remove(b)
n=len(weights)
a=[0]*n
boo=True
c=0
while boo:
i = 0
bJW = True
while i<n and bJW: #进位加法器
if a[i] == 0 :
a[i]= 1
bJW = False
else:
a[i] = 0
bJW = True
i+=1
boo=False
maxWt=0
i=0
while i<n :
if a[i]==1:
if maxWt<max_capacity:
maxWt+=weights[i]
else:
boo=True
i+=1
if maxWt>c and maxWt<=max_capacity:
c=maxWt
return c
def weightNPC(weights:List[int],max_capacity:int)->int:
for a in weights:
if a >max_capacity :
weights.remove(a)
n=len(weights)
dp=[0]*max_capacity
for i in range(n):
j=max_capacity-1
while j>=weights[i]:
dp[j]=max(dp[j],dp[j-weights[i]]+weights[i])
j=j-1
return dp[max_capacity-1]
print("Starting...")
time1=time.time()
#w=[67356,233900,982590,372879,415998,461941,98935,239287,433413,36109,887779,857424,928267,49000,321030,230551,332083,580018,932293,851765,688961,989160,222830,425340,21042,386203,878017,246204,194031,837181,87247,909684,26518,908975,361664,213872,744761,278193,434280,60833]
#r=237733
w=[393475,160580,732972,534138,693123,968128,568316,960203,816302,222601,914770,107641,419535,844112,262804,404124,599548,977638,693620,571373,75218,512746,876939,88477,455114,395077,784405,876985,724954,414721,963000,627072,767523,526531,112644,325038,6571,842459,884845,13454,160268,748438,53640]
r=1000000
#w=[1,3,5,7]
#r=15
#print(weight_capacity(w,r))
print(weightNPC(w,r))
time2=time.time()
print("Oooooooooook!总共费时s:",time2-time1,"秒")
第一组数据的结果是236478,第二组数据结果 999988,第一组数据采用动态规划(一维数组)耗时1.4秒,采用暴力搜索方法,耗时103.8秒。网上多是java或C++算法,本文重点在于测试数据、暴力搜索与动态规划算法(模拟二进制进位的方法形成2^n-1种组合)的对比。