news 2026/4/16 12:24:15

华为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/4/15 9:33:52

django基于 Python 的高校大学生职业就业推荐系统的设计与实现-vue

目录基于 Django 和 Vue 的高校大学生职业就业推荐系统关于博主开发技术介绍核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主…

作者头像 李华
网站建设 2026/4/13 10:01:24

π∗0.6: a VLA That Learns From Experience

序号 属性值1论文名称RECAP2发表时间/位置20253CodeA VLA that Learns from Experience4创新点5引用量 一&#xff1a;提出问题 二&#xff1a;解决方案 三&#xff1a;实验 四&#xff1a;总结

作者头像 李华
网站建设 2026/4/11 8:57:22

图形渲染管线流程笔记

文章目录概述现代GPU的图形渲染管线完整流程阶段详解&#xff08;2D视角&#xff09;输入装配&#xff08;Input Assembler&#xff09;顶点着色器&#xff08;Vertex Shader&#xff09;图元装配&#xff08;Primitive Assembly&#xff09;光栅化&#xff08;Rasterization&a…

作者头像 李华
网站建设 2026/4/15 8:27:45

springboot网络在线教学测试教育系统平台

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

作者头像 李华
网站建设 2026/4/16 12:23:20

家长管理解决方案对比,学生成长记录与家校沟通

摘要Top Pick&#xff1a;爱查分 核心价值&#xff1a;将成绩管理转化为学生成长记录体系&#xff0c;建立专属家校沟通渠道 关键亮点&#xff1a;一对一私密查询、成绩趋势自动生成、家长私聊通道、个性化学习建议推送、多班级统一管理 关键数据&#xff1a;每位家长仅看自己孩…

作者头像 李华