import sys
def dp(num,it):
#dp[i][j]=dp[i-1][j]+dp[i-1][j-weight[i-1]]
weight=[]
for _ in range(num):
item=int(next(it).strip())
weight.append(item)
dp=[0]*(41)
dp[0]=1
for i in range(1,num+1):
for j in range(40,0,-1):
if j-weight[i-1]>=0:
dp[j]+=dp[j-weight[i-1]]
print(dp[-1])
if __name__=='__main__':
it=iter(sys.stdin)
while 1:
try:
num=int(next(it).strip())
dp(num,it)
except:
break
抽象为01背包问题,滚动数组优化,空间n,时间n^2,如果回溯是2^n有超时的风险



京公网安备 11010502036488号