华为机试题41-称砝码
描述
现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
注:
称重重量包括 0
数据范围:每组输入数据满足 1≤n≤10 , 1≤mi≤2000 , 1≤xi≤10
输入描述:
对于每组测试数据:
第一行:n --- 砝码的种数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每种砝码对应的数量(范围[1,10])
输出描述:
利用给定的砝码可以称出的不同的重量数
示例1
输入:
2 1 2 2 1
输出:
5
说明:
可以表示出0,1,2,3,4五种重量。
这道题有一定的难度。
解题思路:
我们可以这么看,比如只有1种砝码,重量是1,共有3个;在加入砝码前,可称的重量只有1种,即{0},现在加入1个砝码,总共可达的重量有{0,0+1},这个0是原来可达的重量,继承下来,0+1表示的是,原来重量加上新砝码之后的重量;现在再加1个砝码,可达的重量有{0,0+1,0+1,0+1+1},红色字体重量为新增砝码后可达的重量,去重复后可达的重量有{0,1,2},那么我们该怎么去重,或者说每加入一个砝码,避免产生重复的重量。
可以这样,我们定义一个足够大的整型数组(此处足够大,表示数组下标应不小于所有砝码可称的最大重量),数组下标表示可称重量,数组元素值为0表示达不到这个重量,为1表示这个重量可以称到,比如arr[4]=1,就表示这些砝码能够称出重量为4的重量,如果arr[6]=0,则表示重量为6用砝码称不出来;由于0也是一种重量,所以arr[0]=1。
最关键的一步,我们每加入一个砝码前,先遍历arr数组,比如新加入的砝码重量为3,且arr[4]=1,我们可知原来的砝码可达4的重量,那么再加入重量为3的砝码,可达的重量就是7,令arr[7]=1,做好标记。需要注意,遍历arr数组时应该从后往前遍历,如若从前往后遍历,还是刚才那个例子,同一个砝码,遍历到arr[7]的时候发现是1,又会得到arr[10]=1,实际上arr[7]原来可能是0,是因为arr[4]=1,再加上重量为3的砝码后才有的arr[7]为1,那这样就会导致给arr[10]赋值为1就是错的,因为加入重量为3的砝码之前,可能根本没能达到重量为7;从后往前遍历就不会有这个问题,这里大家可以思考一下为什么。
了解清楚后,写代码就比较简单了。
#include <stdio.h>
#define N 200000
int main()
{int arr[N]={1}; //arr数组用于记录能够组成的重量,下标为重量,数值1代表能达到int n,m[10],x[10],i,j,k,sum=0,cnt=0;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&m[i]);for(i=0;i<n;i++)scanf("%d",&x[i]);for(i=0;i<n;i++)sum+=m[i]*x[i];for(i=0;i<n;i++) //遍历每一种砝码{for(j=0;j<x[i];j++) //遍历这种砝码的每一个砝码{for(k=sum;k>=0;k--) //重量从后往前遍历{if(arr[k]) //原来可达重量为karr[k+m[i]]=1; //加入新砝码后可达的重量为k+m[i]}}}for(i=0;i<=sum;i++)if(arr[i]) //arr[i]为1,表示能达到重量i,每有一个元素为1,可表示的重量加1cnt++;printf("%d\n",cnt);return 0;
}
华为机试题41-称砝码相关推荐
- 华为电脑c语言总是错误,关于华为机试题求代码!解决方法
关于华为机试题求代码!!! n个字符串,1 如n=3 1.what is local bus? 2.this is local bus. 3.local bus is name sdhfj. 那么最长 ...
- 牛客网华为机试题(JavaScript)
最近在牛客网刷华为机试题,遇到了很多坑,记录: 每一道题目都经过自己实践验证 华为机试题 牛客网在javascript V8引擎下处理输入输出如下: 利用了readline()接收输入的每一行,多行处 ...
- 【牛客网】华为机试题(00、C++版本)
华为机试题,本来以为对一些基础的程序还是有点信心的:不过不练不知道,一练吓一跳.平时虽然也都码程序,但是一到机试题就各种乱七八的不适应.还是要加强一下练习. 1.字符串最后一个单词的长度 题目描述:计 ...
- 【牛客网-华为机试题目录】持续更新中
文章目录 博主精品专栏导航 华为机试题:HJ80 整型数组合并(python) 华为机试题:HJ76 尼科彻斯定理(python) 华为机试题:HJ73 计算日期到天数转换(python) 华为机试题 ...
- 华为机试题库+题解【C语言版】
文章目录 前言 1.字符串最后一个单词的长度[***] 描述 输入描述 输出描述 示例 解题代码 2.计算某字符出现次数[****] 描述 输入描述 输出描述 示例 解题代码 3. 明明的随机数[** ...
- 华为机试python编程题_牛客网华为机试题之Python解法
牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...
- 【华为机试题分析-C/C++】知识点分类总结
专栏地址:https://blog.csdn.net/super828/category_10825347.html 字符串 [华为机试题分析] 1 字符串最后一个单词的长度 [华为机试题分析] 2 ...
- 【华为机试题分析】 4 字符串分割
我的首发平台是公众号[CodeAllen],学习交流QQ群:736386324,本文版权归作者所有,转载请注明出处 [华为机试题分析] 4 字符串分割 #include <stdio.h> ...
- 【华为机试 Python实现】华为机试题集合(已更新171篇)
文章目录 新手指引 数据结构基础 华为机试真题系列 牛客网华为机试系列 Python 八股文系列 <华为机试真题详解>专栏定价99.9 包含 <华为机试真题>的所有题目. 包含 ...
- 华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典
文章目录 2023 年用 Python 语言解华为 OD 机试题,一篇博客找全. 华为 OD 机试题清单(机试题库还在逐日更新) 2023 年用 Python 语言解华为 OD 机试题,一篇博客找全. ...
最新文章
- 【解决】联想thinkpad E40 如何禁用触摸板
- Javascript函数的简单学习
- 两分钟用C#搭建IE BHO勾子, 窃取密码
- 另类的 高版本数据库 转换到 低版本数据库
- Linux命令——find详解
- 【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验
- solr 英文模拟mysql like查询xml_Solr实现类似MySQL的LIKE查询功能
- python3 解析 base64 数据
- CSS样式布局入门介绍,非常详尽
- 为什么volatile能保证有序性不能保证原子性
- kafka权威指南-笔记
- 【游戏引擎Easy2D】学C++还在面对黑框框?那是你没看这篇文,游戏引擎教会你
- 图片放大后很模糊怎么办?
- 如何批量将 Xls 格式的 Excel 文档转为 Xlsx 格式
- OVM学习--持续更新
- 基于SpringBoot的QQ邮箱登录注册
- iis服务器响应缓慢,IIS网站加载缓慢怎么办?如何处理?
- Python数据 分析微信朋友圈
- 4G PCIE网卡在英创ESM6800上的使用步骤
- 餐饮SaaS行进时:美团To B,二维火To C
热门文章
- 均匀分布随机数产生算法
- 让百万职场人爱不释手的办公工具,“TOM随心邮”究竟有何优势?
- 【三分/贪心/数学】装备合成
- git 环境搭建 下载安装
- 交易所平台币综合研究报告 | TokenInsight
- 荒野日记如何在电脑上玩 荒野日记模拟器玩法教程
- 签到考勤java课设_Java程序设计课程设计学生考勤系统Word版
- 2015新年春节素材图片
- 因为AI,我被裁了;MJ设计海报全流程;独立开发者每周收入2.3K美元;MJ常用参数超详细介绍 | ShowMeAI日报
- process.argv