描述:
有一组砝码,重量互不相等,分别为m1、m2、m3……mn;它们可取的最大数量分别为x1、x2、x3……xn。
现要用这些砝码去称物体的重量,问能称出多少种不同的重量。
现在给你两个正整数列表w和n, 列表w中的第i个元素w[i]表示第i个砝码的重量,列表n的第
i个元素n[i]表示砝码i的最大数量。i从0开始,请你输出不同重量的种数。
如:w=[1,2], n=[2,1], 则输出5(分析:共有五种重量:0,1,2,3,4)
解法一:
#每种砝码提供一个重量,消除重复
def x(a,b):
x = []
for i in a:
for j in b:
c = i+ j
if c not in x:
x.append(c)
return x
#此处以w=[1,2,4],n=[4,2,1]为例解释
#此处L==[[0,1,2,3,4],[0,2,4],[0,4]],表示每种砝码能提供的重量
def fama(w,n):
l = []
for i in range(len(w)):
l.append([])
for j in range(n[i]+1):
l[i].append(w[i]*j)
#这里就把前两种的可能性列出来,看作新的,再用reduce搞定
L = reduce(x,l)
return len(L)
w = [1,2,4]
n = [4,2,1]
print fama(w,n)
解法二:
集合进行排异处理
W = {0}
L = {0}
for i,v in enumerate(n):
for j in range(v+1):
L.add(j * w[i])
W = {x+y for x in W for y in L}
L = {0}
print len(W)
解法三:
动态规划
total_w=0
length_n=len(w)
for i in range(length_n):
total_w+=w[i]*n[i]
S=set([])
S.add(total_w)
for i in range(length_n):
temp_S=S.copy()
for s in temp_S:
j=1
while j<=n[i]:
S.add(s-j*w[i])
j+=1
print len(S)