砝码问题

描述:

有一组砝码,重量互不相等,分别为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)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值