蓝桥杯习题-砝码称重(动态规划)Python实现

2023-10-27

问题描述:你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1, W2, · · · WN

请你计算一共可以称出多少种不同的重量?

注意砝码可以放在天平两边

输入的第一行包含一个整数 N

第二行包含 N 个整数:W1, W2, W3, · · · WN输出一个整数代表答案

输出一个整数代表答案

样例输入

3

1 4 6

样例输出

10


思路解析:这道题采用两种方法。

第一种是常规的循环遍历,将各种可能的情况写入列表,计算其长度求解。

ans=set()      #集合的特点去重
n=int(input())
s=list(map(int,input().split()))
ans.add(s[0])   #集合把第一个砝码加进去方便第一次计算
for i in range(1,n):
   a=[]     #用来存储每一次加or减的结果
   for j in ans:
       a.append(j+s[i])
       a.append(abs(j-s[i]))
   for k in a:
       if k!=0:   #重量不能为0
          ans.add(k)
   ans.add(s[i])   #当前砝码加入集合
print(len(ans))

第二种是用动态规划的思想,设置一个状态dp[p][q],来表示取到第p个砝码,q重量能否被测出。用0和1代表False 和True,最后计算出dp表1的数量即可。

难点:dp状态转移方程(需考虑多种情况)

  1. a[p-1]代表新加入这个砝码的重量,如果与这个未知量q相等,则dp值为1

  1. dp[p-1]代表一个集合X(已知或者说已经测出来的数据集合),dp[p-1][a[p-1]+q]就表示,在集合X中是否有一个数等于a[p-1]+q,如果有则dp[p-1][a[p-1]+q]这个式子存在,令dp值为1。

  1. dp[p-1][abs(a[p-1]-q)]表示在集合X中是否有一个数等于a[p-1]-q的绝对值,如果有则dp[p-1][abs(a[p-1]-q)]这个式子存在,令dp值为1

最后就是遍历dp表中为1的数,代表可以表示重量的个数

n=int(input())
a=list(map(int,input().split()))
sum=0
for i in a:   #确定q的最大取值范围sum
    sum+=i
ans=0
dp=[[0]*2*sum for i in range(n+1)]  #前列后行,只要行列满足最大范围即可,可*3或4等等
for p in range(1,n+1):
   for q in range(1,sum+1):
       dp[p][q]=dp[p-1][q] #假设加到第三个砝码就可以测出来q,就不必再加第四个砝码,令其dp值为1,则后面的if语句不再执行
       if dp[p][q]==0:
            if a[p-1]==q:
               dp[p][q]=1
            if dp[p-1][a[p-1]+q]:
               dp[p][q]=1
            if dp[p-1][abs(a[p-1]-q)]:
               dp[p][q]=1
for i in dp[n]:
   if i != 0:
      ans+=1
print(ans)

感觉还是有很多不足,欢迎大家来指点

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯习题-砝码称重(动态规划)Python实现 的相关文章

随机推荐

  • 算法—二叉树递归遍历

    测试的二叉树的结构 root lfb1 rtb1 rtb2 控制台输出的遍历结果 从根节点开始 前序遍历此二叉树 root lfb1 rtb1 rtb2 从根节点开始 中序遍历此二叉树 lfb1 root rtb1 rtb2 从根节点开始
  • 思考:语义过程

    2020 06 14 我有点明白泛化过程的含义了 当时也在阿里的那个文章中看到过 就是说 现在很多机器学习的泛化能力差在网络安全方面 泛化能力 我的理解就是 如果是想模型硬性的记住一些东西 那他就没有泛化能力 但是如果你能够有一些泛化能力
  • 【AIGC】一款离线版的AI智能换脸工具V2.0分享(支持图片、视频、直播)

    随着人工智能技术的爆发 AI不再局限于大语言模型 在图片处理方面也有非常大的进步 其中AI换脸也是大家一直比较感兴趣的 但这个技术的应用一直有很大的争议 今天给大家分享一个开源你的AI换脸工具2 0 只需要一张所需脸部的图像 无需数据集 无
  • Java使用GDAL

    在使用Java处理图像时使用Gdal 为了保持软件在Windows Linux的通用性 本文着重介绍Windows和Linux环境的gdal配置 为了简便期间 使用gdal 2 2 3 一 Windows Windows下gdal配置比较简
  • Android混淆机制

    java代码的混淆 常见的混淆的方式有两种 Proguard 免费 和 DexGuard 要钱 Proguard 与 DexGuard 的关系 DexGuard 是基于 ProGuard 的 这就是为什么它是如此的原因很容易升级到DexGu
  • css 实现文字渐变以及文字颜色流动

    文字渐变需要了解以下属性 background image 背景色 background clip 此属性规定背景的绘制区域 有四个值 border box 背景被裁剪到边框盒 padding box 背景被裁剪到内边距框 content
  • 【C语言】32个关键词

    目录 一 auto 二 short 三 int 四 long 五 float 六 double 七 char 八 struct 九 union 十 enum 十一 typedef 十二 const 十三 unsigned 十四 signed
  • linux top命令VIRT,RES,SHR,DATA的含义

    VIRT virtual memory usage 虚拟内存1 进程 需要的 虚拟内存大小 包括进程使用的库 代码 数据等2 假如进程申请100m的内存 但实际只使用了10m 那么它会增长100m 而不是实际的使用量 RES residen
  • 165.比较版本号

    165 比较版本号 给你两个版本号 version1 和 version2 请你比较它们 版本号由一个或多个修订号组成 各修订号由一个 连接 每个修订号由 多位数字 组成 可能包含 前导零 每个版本号至少包含一个字符 修订号从左到右编号 下
  • AOD相关机制

    AOD的概念 AOD 即A lways O n D isplay 是android一种低功耗的显示模式的一种应用 他能保证屏幕某块区域一直亮 该应用开启时绘制的频率会低于正常的频率 由于AOD现实的不是和正常的亮屏之后显示的一样 只 会显示
  • LuCI 支持多语言,并设置简体中文为默认语言

    安装LuCI语言包 LuCI gt Modules gt Translations gt English en Chinese zh cn Taiwanese zh tw 修改源配置文件 feeds luci modules luci ba
  • RocksDB之Column Families(列族)与 LSM Tree

    1 Column Families 列族 Column Families 是rocksdb3 0提出的一个机制 用于对同一个数据库的记录 键值对 进行逻辑划分 默认情况下所有的记录都会存储在一个默认列族里 ROCKSDB NAMESPACE
  • STM 8 学习笔记 6:GPIO

    1 概述 GPIO 是通用输入输出端口的简称 CPU 通过 GPIO 与外部设备连接起来 从而实现与外部通讯 控制以及数据采集的功能 GPIO 功能框图如下所示 2 相关寄存器 Px ODR 端口数据输出寄存器 配置输出到引脚的高低电平 P
  • 有关easyDL的浅析(资料集合)

    在EasyDL的服务端 有下面几种核心技术 AI Workflow分布式引擎 百度自创PaddlePaddle深度学习框架 迁移学习 Auto Model Search机制 early stoopping机制 模型效果评估机制 下面来一一了
  • vue--配置 请求/响应拦截器

    配置响应拦截器 在案例中后端传输给我的数据包括 响应码 code 响应信息 message 对象 由于我们前端在发送一个请求时 服务端的响应也许会各不相同 我们前端所做出的处理也会不一样 可是如果在每个事件里都单独将对于这些不同响应的处理都
  • elasticsearch基本入门学习笔记

    Elasticsearch学习笔记 一 ElasticSearch概述 历史 谁在使用 ES和Solr 二 ElasticSearch安装 1 安装 2 熟悉目录 3 启动 三 elasticsearch head 可视化界面 四 kiba
  • 深度学习基础--finetune

    finetune 就是用别人训练好的模型 加上我们自己的数据 来训练新的模型 finetune相当于使用别人的模型的前几层 来提取浅层特征 然后在最后再落入我们自己的分类中 finetune的好处在于不用完全重新训练模型 从而提高效率 因为
  • leetcode:1812. 判断国际象棋棋盘中一个格子的颜色(python3解法)

    难度 简单 给你一个坐标 coordinates 它是一个字符串 表示国际象棋棋盘中一个格子的坐标 下图是国际象棋棋盘示意图 如果所给格子的颜色是白色 请你返回 true 如果是黑色 请返回 false 给定坐标一定代表国际象棋棋盘上一个存
  • 你知道 1 + 1 等于几吗?

    阅读本文需要 4 分钟 前言 当有人问你1 1等于几的时候 你会觉着这是对你的一种侮辱 这种弱智问题 居然拿来问我 听起来好像你说的没错 1 1是挺简单的 可是如果让你证明的话 可能你这一辈子都证明不出来 稍微知道一点的人 可能会联想到我国
  • 蓝桥杯习题-砝码称重(动态规划)Python实现

    问题描述 你有一架天平和 N 个砝码 这 N 个砝码重量依次是 W1 W2 WN 请你计算一共可以称出多少种不同的重量 注意砝码可以放在天平两边 输入的第一行包含一个整数 N 第二行包含 N 个整数 W1 W2 W3 WN输出一个整数代表答