news 2026/6/4 6:52:51

华为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/5/30 19:38:34

【信号完整性】:信号与连接

文章目录1. 连接对信号波形的影响2. 信号的传输过程1. 连接对信号波形的影响 信号从发送端发出时是什么样子&#xff1f;经过连接到达接收端后&#xff0c;是什么样子&#xff1f; 一个触发器和一个反相器组成的简单的数字电路&#xff0c;工作频率 5MHz&#xff0c;周期 0.2…

作者头像 李华
网站建设 2026/6/3 16:16:57

2025必备!10个一键生成论文工具,专科生轻松搞定毕业论文!

2025必备&#xff01;10个一键生成论文工具&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何让论文写作更高效&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助 AI 工具来辅助毕业论文的撰写。这些工具不仅能够帮助学生节省大量时间…

作者头像 李华
网站建设 2026/5/27 21:52:58

linux 进程和线程的本质区别是什么

在Linux系统中&#xff0c;进程与线程的本质区别体现在资源分配、调度机制、上下文切换成本、通信方式及安全性等多个维度&#xff0c;具体分析如下&#xff1a; 1. 资源分配与隔离性 进程&#xff1a;是操作系统资源分配的基本单位&#xff0c;拥有独立的地址空间、内存、文…

作者头像 李华
网站建设 2026/5/27 21:52:04

1.3 Kubernetes核心概念详解:掌握本地集群配置与应用部署秘诀

1.3 Kubernetes核心概念详解:掌握本地集群配置与应用部署秘诀 Kubernetes(简称K8s)是当前最流行的容器编排平台,它为容器化应用提供了部署、扩展和管理的完整解决方案。本文将深入解析Kubernetes的核心概念,带你从零开始搭建本地集群,并掌握应用部署的关键技巧。 Kuber…

作者头像 李华