• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
村雨sup
自己选的路,跪着也要走完 XD
博客园    首页    新随笔    联系   管理    订阅  订阅
python 小练习 8
砝码问题1
有一组砝码,重量互不相等,分别为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)

import copy

rsl = set()
rsl.add(0)                        #这里有个初始值0,很重要
size = len(n)

for i in range(size):
    temp = copy.deepcopy(rsl)     #复制一个集合
    for j in range(n[i]+1):
        v = w[i]*j                #j个重量
        for value in temp:        #不停用基础数据加上增加的数据
            rsl.add(value+v)      #用集合的好处就是能不重复的加上数
print(len(rsl))

 砝码问题2:

有一组砝码,重量互不相等,分别为m1、m2、m3……mn;每种砝码的数量有无限个。 
现要用这些砝码去称物体的重量,给你一个重量n,请你判断有给定的砝码能否称出重量n。 
现在给你一个正整数列表w和一个正整数n,列表w中的第i个元素w[i]表示第i种砝码的重量,
n表示要你判断的重量。如果给定砝码能称出重量n,输出Yes,否则输出No。
例如,w=[2,5,11], n=9,则输出Yes(取两个2,一个5)。
AC:解法背包法
L=len(w)
s=[-1 for i in range(n+1)]
s[0]=0
for i in range(L):
    for j in range(1,n+1):
        if j-w[i]>=0 and s[j-w[i]]!=-1:  #第一个是取到s[0]=0
            s[j]=1       #从最小的加起,如果能取到就换为1
if s[n]!=-1:
    print 'yes'
else:
    print "no"

 

posted on 2017-07-24 15:56  村雨sup  阅读(312)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3