news 2026/1/26 5:31:18

华为OD机试真题 - 称砝码 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试真题 - 称砝码 (C++ Python JAVA JS GO)

称砝码

华为OD机试 - 华为OD上机考试 100分题型

华为OD机试真题目录点击查看: 华为OD机试真题题库目录|机考题库 + 算法考点详解

题目描述

现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3…xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。

输入描述

对于每组测试数据:
第一行:n — 砝码的种数(范围[1,10])
第二行:m1 m2 m3 … mn — 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 … xn — 每种砝码对应的数量(范围[1,10])

备注

数据范围:每组输入数据满足:

  • 1 ≤ n ≤ 10
  • 1 ≤ mi ≤ 2000
  • 1 ≤ xi ≤ 10

输出描述

利用给定的砝码可以称出的不同的重量数

用例1

输入

2 1 2 2 1

输出

5

说明

可以表示出0,1,2,3,4五种重量。

题解一

思路:很容易想到newWeight = oldWeight + weight[i],每次循环时只需要用已有的重量再加上新的砝码重量值即可。使用set集合去重,每次用放置新砝码时用集合中已有重量 + weight[i]即可,得到的结果继续放入集合中,待下次放置时使用。最终集合的大小便是结果。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<list> #include<queue> #include<set> using namespace std; int main() { int n; cin >> n; vector<int> weight(n); vector<int> nums(n); for (int i = 0; i < n; i++) { cin >>weight[i]; } for (int i = 0; i < n; i++) { cin >>nums[i]; } // 去重 set<int> s; s.insert(0); for (int i = 0; i < n; i++) { for (int j = 0; j < nums[i]; j++) { set<int>s1(s.begin(), s.end()); // 枚举 for (int x : s1) { s.insert(x + weight[i]); } } } cout << s.size(); return 0; }

JAVA

import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] weight = new int[n]; int[] nums = new int[n]; for (int i = 0; i < n; i++) { weight[i] = scanner.nextInt(); } for (int i = 0; i < n; i++) { nums[i] = scanner.nextInt(); } scanner.close(); // 用 HashSet 进行去重 Set<Integer> s = new HashSet<>(); s.add(0); for (int i = 0; i < n; i++) { for (int j = 0; j < nums[i]; j++) { List<Integer> tempList = new ArrayList<>(s); List<Integer> newElements = new ArrayList<>(); for (int x : tempList) { newElements.add(x + weight[i]); } s.addAll(newElements); } } System.out.println(s.size()); } }

Python

importsys# 读取输入n=int(sys.stdin.readline().strip())weight=list(map(int,sys.stdin.readline().split()))nums=list(map(int,sys.stdin.readline().split()))# 使用 set 进行去重s={0}foriinrange(n):for_inrange(nums[i]):temp_list=list(s)new_elements=[x+weight[i]forxintemp_list]s.update(new_elements)print(len(s))

JavaScript

constreadline=require("readline");constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinput=[];rl.on("line",(line)=>{input.push(line.trim());if(input.length===3){letn=parseInt(input[0]);letweight=input[1].split(" ").map(Number);letnums=input[2].split(" ").map(Number);// 使用 Set 进行去重lets=newSet();s.add(0);for(leti=0;i<n;i++){for(letj=0;j<nums[i];j++){lettempList=Array.from(s);letnewElements=tempList.map(x=>x+weight[i]);newElements.forEach(e=>s.add(e));}}console.log(s.size);rl.close();}});

Go

packagemainimport("bufio""fmt""os""strconv""strings")funcmain(){// 读取输入reader:=bufio.NewReader(os.Stdin)nStr,_:=reader.ReadString('\n')n,_:=strconv.Atoi(strings.TrimSpace(nStr))weightStr,_:=reader.ReadString('\n')weight:=strToIntArray(weightStr)numsStr,_:=reader.ReadString('\n')nums:=strToIntArray(numsStr)// 使用 map 作为 set 进行去重s:=make(map[int]bool)s[0]=truefori:=0;i<n;i++{forj:=0;j<nums[i];j++{tempList:=make([]int,0,len(s))forkey:=ranges{tempList=append(tempList,key)}newElements:=make([]int,len(tempList))fork,x:=rangetempList{newElements[k]=x+weight[i]}for_,newVal:=rangenewElements{s[newVal]=true}}}fmt.Println(len(s))}// strToIntArray 将输入字符串转换为整数数组funcstrToIntArray(inputstring)[]int{fields:=strings.Fields(input)arr:=make([]int,len(fields))fori,v:=rangefields{arr[i],_=strconv.Atoi(v)}returnarr}

题解二

思路:完全背包算法处理,dp[j] = dp[j - weight[i] * num]

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<list> #include<queue> #include<set> using namespace std; int main() { int n; cin >> n; vector<int> weight(n); vector<int> nums(n); for (int i = 0; i < n; i++) { cin >>weight[i]; } for (int i = 0; i < n; i++) { cin >>nums[i]; } // 完全背包 int sum = 0; for (int i = 0; i < n; i++) { sum += weight[i] * nums[i]; } vector<int> dp(sum + 1, 0); dp[0] = 1; // 完全背包 for (int i = 0; i < n; i++) { for (int j = 1; j <= nums[i]; j++) { for (int k = sum; k >= weight[i] * j; k--) { if (dp[k - weight[i]]) { dp[k] = 1; } } } } int count = 0; for (int i = 0; i <= sum; i++) { if (dp[i]) { count++; } } cout << count; return 0; }

JAVA

import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] weight = new int[n]; int[] nums = new int[n]; for (int i = 0; i < n; i++) { weight[i] = scanner.nextInt(); } for (int i = 0; i < n; i++) { nums[i] = scanner.nextInt(); } scanner.close(); // 计算总重量 int sum = 0; for (int i = 0; i < n; i++) { sum += weight[i] * nums[i]; } // 完全背包 DP boolean[] dp = new boolean[sum + 1]; dp[0] = true; // 初始状态 for (int i = 0; i < n; i++) { for (int j = 1; j <= nums[i]; j++) { for (int k = sum; k >= weight[i] * j; k--) { if (dp[k - weight[i]]) { dp[k] = true; } } } } // 统计可达的重量数 int count = 0; for (boolean v : dp) { if (v) count++; } System.out.println(count); } }

Python

importsys# 读取输入n=int(sys.stdin.readline().strip())weight=list(map(int,sys.stdin.readline().split()))nums=list(map(int,sys.stdin.readline().split()))# 计算总重量sum_weight=sum(weight[i]*nums[i]foriinrange(n))# 完全背包 DPdp=[0]*(sum_weight+1)dp[0]=1# 初始状态foriinrange(n):forjinrange(1,nums[i]+1):forkinrange(sum_weight,weight[i]*j-1,-1):ifdp[k-weight[i]]:dp[k]=1# 统计可达的重量数print(sum(dp))

JavaScript

constreadline=require("readline");constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinput=[];rl.on("line",(line)=>{input.push(line.trim());if(input.length===3){letn=parseInt(input[0]);letweight=input[1].split(" ").map(Number);letnums=input[2].split(" ").map(Number);// 计算总重量letsum=0;for(leti=0;i<n;i++){sum+=weight[i]*nums[i];}// 完全背包 DPletdp=newArray(sum+1).fill(0);dp[0]=1;for(leti=0;i<n;i++){for(letj=1;j<=nums[i];j++){for(letk=sum;k>=weight[i]*j;k--){if(dp[k-weight[i]]){dp[k]=1;}}}}// 统计可达的重量数letcount=dp.reduce((acc,val)=>acc+val,0);console.log(count);rl.close();}});

Go

packagemainimport("bufio""fmt""os""strconv""strings")funcmain(){// 读取输入reader:=bufio.NewReader(os.Stdin)nStr,_:=reader.ReadString('\n')n,_:=strconv.Atoi(strings.TrimSpace(nStr))weightStr,_:=reader.ReadString('\n')weight:=strToIntArray(weightStr)numsStr,_:=reader.ReadString('\n')nums:=strToIntArray(numsStr)// 计算总重量sum:=0fori:=0;i<n;i++{sum+=weight[i]*nums[i]}// 完全背包 DPdp:=make([]bool,sum+1)dp[0]=true// 初始状态fori:=0;i<n;i++{forj:=1;j<=nums[i];j++{fork:=sum;k>=weight[i]*j;k--{ifdp[k-weight[i]]{dp[k]=true}}}}// 统计可达的重量数count:=0for_,v:=rangedp{ifv{count++}}fmt.Println(count)}// strToIntArray 将输入字符串转换为整数数组funcstrToIntArray(inputstring)[]int{fields:=strings.Fields(input)arr:=make([]int,len(fields))fori,v:=rangefields{arr[i],_=strconv.Atoi(v)}returnarr}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/15 5:21:04

免费开源Http、Https抓包工具

链接&#xff1a;https://pan.quark.cn/s/2f3861e153c6一款跨平台免费开源Http、Https抓包工具&#xff0c;支持Windows、Mac、Android、IOS 全平台系统&#xff0c;工具使用flutter框架开发&#xff0c;支持手机扫码连接&#xff0c;不用手动配置Wifi代{过}{滤}理&#xff0c;…

作者头像 李华
网站建设 2026/1/12 9:29:56

java基于SpringBoot的中华诗词文化交流平台的设计与实现-vue

目录设计目标技术架构核心功能创新点关于博主开发技术介绍核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff…

作者头像 李华
网站建设 2026/1/17 21:32:43

java基于SpringBoot的乐器商城商品推荐系统设计与实现-vue

目录 摘要 关于博主开发技术介绍 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 摘要 该系统基于Spr…

作者头像 李华
网站建设 2026/1/15 19:11:11

【MicroPython编程-ESP32篇】-MQTT上传BME680传感器数据

MQTT上传BME680传感器数据 文章目录 MQTT上传BME680传感器数据 1、BME680介绍 2、软件准备 3、硬件准备与接线 4、代码实现 4.1 BME680驱动实现 4.2 MQTT客户端实现 4.3 主程序代码 在本文中,将介绍如何将BME680传感器模块与 ESP32一起使用,并通过MicroPython 固件获取压力、…

作者头像 李华
网站建设 2026/1/9 17:17:52

强烈安利!8款AI论文软件测评,本科生毕业论文必备

强烈安利&#xff01;8款AI论文软件测评&#xff0c;本科生毕业论文必备 2025年AI论文工具测评&#xff1a;为何值得一看&#xff1f; 随着人工智能技术的不断发展&#xff0c;越来越多的本科生开始借助AI论文软件来提升写作效率、优化论文结构&#xff0c;甚至辅助文献检索与格…

作者头像 李华
网站建设 2026/1/15 0:32:36

【毕业设计】基于机器学习的人脸发型推荐算法研究与应用实现

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华