描述

现有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-称砝码相关推荐

  1. 华为电脑c语言总是错误,关于华为机试题求代码!解决方法

    关于华为机试题求代码!!! n个字符串,1 如n=3 1.what is local bus? 2.this is local bus. 3.local bus is name sdhfj. 那么最长 ...

  2. 牛客网华为机试题(JavaScript)

    最近在牛客网刷华为机试题,遇到了很多坑,记录: 每一道题目都经过自己实践验证 华为机试题 牛客网在javascript V8引擎下处理输入输出如下: 利用了readline()接收输入的每一行,多行处 ...

  3. 【牛客网】华为机试题(00、C++版本)

    华为机试题,本来以为对一些基础的程序还是有点信心的:不过不练不知道,一练吓一跳.平时虽然也都码程序,但是一到机试题就各种乱七八的不适应.还是要加强一下练习. 1.字符串最后一个单词的长度 题目描述:计 ...

  4. 【牛客网-华为机试题目录】持续更新中

    文章目录 博主精品专栏导航 华为机试题:HJ80 整型数组合并(python) 华为机试题:HJ76 尼科彻斯定理(python) 华为机试题:HJ73 计算日期到天数转换(python) 华为机试题 ...

  5. 华为机试题库+题解【C语言版】

    文章目录 前言 1.字符串最后一个单词的长度[***] 描述 输入描述 输出描述 示例 解题代码 2.计算某字符出现次数[****] 描述 输入描述 输出描述 示例 解题代码 3. 明明的随机数[** ...

  6. 华为机试python编程题_牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  7. 【华为机试题分析-C/C++】知识点分类总结

    专栏地址:https://blog.csdn.net/super828/category_10825347.html 字符串 [华为机试题分析] 1 字符串最后一个单词的长度 [华为机试题分析] 2 ...

  8. 【华为机试题分析】 4 字符串分割

    我的首发平台是公众号[CodeAllen],学习交流QQ群:736386324,本文版权归作者所有,转载请注明出处 [华为机试题分析] 4 字符串分割 #include <stdio.h> ...

  9. 【华为机试 Python实现】华为机试题集合(已更新171篇)

    文章目录 新手指引 数据结构基础 华为机试真题系列 牛客网华为机试系列 Python 八股文系列 <华为机试真题详解>专栏定价99.9 包含 <华为机试真题>的所有题目. 包含 ...

  10. 华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典

    文章目录 2023 年用 Python 语言解华为 OD 机试题,一篇博客找全. 华为 OD 机试题清单(机试题库还在逐日更新) 2023 年用 Python 语言解华为 OD 机试题,一篇博客找全. ...

最新文章

  1. 【解决】联想thinkpad E40 如何禁用触摸板
  2. Javascript函数的简单学习
  3. 两分钟用C#搭建IE BHO勾子, 窃取密码
  4. 另类的 高版本数据库 转换到 低版本数据库
  5. Linux命令——find详解
  6. 【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验
  7. solr 英文模拟mysql like查询xml_Solr实现类似MySQL的LIKE查询功能
  8. python3 解析 base64 数据
  9. CSS样式布局入门介绍,非常详尽
  10. 为什么volatile能保证有序性不能保证原子性
  11. kafka权威指南-笔记
  12. 【游戏引擎Easy2D】学C++还在面对黑框框?那是你没看这篇文,游戏引擎教会你
  13. 图片放大后很模糊怎么办?
  14. 如何批量将 Xls 格式的 Excel 文档转为 Xlsx 格式
  15. OVM学习--持续更新
  16. 基于SpringBoot的QQ邮箱登录注册
  17. iis服务器响应缓慢,IIS网站加载缓慢怎么办?如何处理?
  18. Python数据 分析微信朋友圈
  19. 4G PCIE网卡在英创ESM6800上的使用步骤
  20. 餐饮SaaS行进时:美团To B,二维火To C

热门文章

  1. 均匀分布随机数产生算法
  2. 让百万职场人爱不释手的办公工具,“TOM随心邮”究竟有何优势?
  3. 【三分/贪心/数学】装备合成
  4. git 环境搭建 下载安装
  5. 交易所平台币综合研究报告 | TokenInsight
  6. 荒野日记如何在电脑上玩 荒野日记模拟器玩法教程
  7. 签到考勤java课设_Java程序设计课程设计学生考勤系统Word版
  8. 2015新年春节素材图片
  9. 因为AI,我被裁了;MJ设计海报全流程;独立开发者每周收入2.3K美元;MJ常用参数超详细介绍 | ShowMeAI日报
  10. process.argv