news 2026/5/1 9:14:15

华为OD机考双机位B卷 - 组装新的数组 (Java Python JS C/C++ GO )

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机考双机位B卷 - 组装新的数组 (Java Python JS C/C++ GO )

最新华为上机考试

真题目录:点击查看目录

华为OD面试真题精选:点击立即查看
华为OD机考双机位B卷 - 组装新的数组

题目描述

给你一个整数M和数组N,N中的元素为连续整数,要求根据N中的元素组装成新的数组R,组装规则:

  1. R中元素总和加起来等于M
  2. R中的元素可以从N中重复选取
  3. R中的元素最多只能有1个不在N中,且比N中的数字都要小(不能为负数)

输入描述

第一行输入是连续数组N,采用空格分隔
第二行输入数字M

备注

  • 1 ≤ M ≤ 30
  • 1 ≤ N.length ≤ 1000

输出描述

输出的是组装办法数量,int类型

示例1

输入

2 5

输出

1

说明

只有1种组装办法,就是[2,2,1]

示例2

输入

2 3 5

输出

2

说明

一共两种组装办法,分别是[2,2,1],[2,3]

解题思路

Java

importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Stringline=sc.nextLine();List<Integer>arr=newArrayList<>();String[]nums=line.split(" ");for(Stringnum:nums){arr.add(Integer.parseInt(num));}intm=sc.nextInt();// 获取数组中的最小值intmin_num=Collections.min(arr);// 动态规划int[]dp=newint[m+1];dp[0]=1;for(intnum:arr){for(inti=num;i<=m;i++){dp[i]+=dp[i-num];}}intcount=dp[m];for(inti=1;i<min_num;i++){count+=dp[m-i];}System.out.println(count);}}

Python

defmain():line=input().strip()arr=list(map(int,line.split()))m=int(input())# 获取数组中的最小值min_num=min(arr)# 动态规划dp=[0]*(m+1)dp[0]=1fornuminarr:foriinrange(num,m+1):dp[i]+=dp[i-num]count=dp[m]foriinrange(1,min_num):count+=dp[m-i]print(count)if__name__=="__main__":main()

JavaScript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});rl.on('line',(line)=>{constarr=line.split(' ').map(Number);rl.on('line',(mInput)=>{constm=parseInt(mInput,10);// 获取数组中的最小值constminNum=Math.min(...arr);// 动态规划constdp=newArray(m+1).fill(0);dp[0]=1;for(constnumofarr){for(leti=num;i<=m;i++){dp[i]+=dp[i-num];}}letcount=dp[m];for(leti=1;i<minNum;i++){count+=dp[m-i];}console.log(count);rl.close();});});

C++

#include<iostream>#include<vector>#include<sstream>#include<algorithm>using namespace std;intmain(){string line;getline(cin,line);vector<int>arr;istringstreamiss(line);intnum;while(iss>>num){arr.push_back(num);}intm;cin>>m;// 获取数组中的最小值intmin_num=*min_element(arr.begin(),arr.end());// 动态规划vector<int>dp(m+1,0);dp[0]=1;for(intnum:arr){for(inti=num;i<=m;i++){dp[i]+=dp[i-num];}}intcount=dp[m];for(inti=1;i<min_num;i++){count+=dp[m-i];}cout<<count<<endl;return0;}

Go

package main import ( "bufio" "fmt" "math" "os" "strconv" "strings" ) func main() { // 创建 scanner 读取输入 scanner := bufio.NewScanner(os.Stdin) // 1. 读取第一行 if !scanner.Scan() { return } line := scanner.Text() // 2. 解析数组 var arr []int minNum := math.MaxInt32 // Fields 会自动处理多个连续空格,并去除首尾空格 strNums := strings.Fields(line) for _, strNum := range strNums { num, err := strconv.Atoi(strNum) if err == nil { arr = append(arr, num) // 寻找最小值 if num < minNum { minNum = num } } } // 3. 读取 m // 继续扫描下一行或下一个 token if !scanner.Scan() { return } mStr := scanner.Text() // 如果 m 和数组在同一行但被换行符隔开,或者 m 独占一行, m, _ := strconv.Atoi(strings.TrimSpace(mStr)) // 4. 动态规划 dp := make([]int, m+1) dp[0] = 1 for _, num := range arr { for i := num; i <= m; i++ { dp[i] += dp[i-num] } } // 5. 计算结果 count := dp[m] for i := 1; i < minNum; i++ { if m-i >= 0 { count += dp[m-i] } } fmt.Println(count) }

C语言

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<limits.h>#defineMAX_LINE_LENGTH100000intmain(){// 1. 读取第一行输入 (数组)charline[MAX_LINE_LENGTH];if(fgets(line,sizeof(line),stdin)==NULL){return0;}// 2. 解析整数存入动态数组 (这里为了简单使用定长数组,可根据需要改为 malloc)int*arr=NULL;intarr_size=0;intarr_capacity=100;arr=(int*)malloc(arr_capacity*sizeof(int));intmin_num=INT_MAX;// 使用 strtok 分割空格char*token=strtok(line," \r\n");// 同时处理回车换行符while(token!=NULL){if(arr_size>=arr_capacity){arr_capacity*=2;arr=(int*)realloc(arr,arr_capacity*sizeof(int));}intnum=atoi(token);arr[arr_size++]=num;// 寻找最小值if(num<min_num){min_num=num;}token=strtok(NULL," \r\n");}// 3. 读取 mintm;scanf("%d",&m);// 4. 动态规划// 使用 calloc 初始化为 0int*dp=(int*)calloc(m+1,sizeof(int));dp[0]=1;for(intk=0;k<arr_size;k++){intnum=arr[k];for(inti=num;i<=m;i++){dp[i]+=dp[i-num];}}// 5. 计算结果longlongcount=dp[m];// 使用 long long 防止累加溢出,尽管 Java 原版用的 intfor(inti=1;i<min_num;i++){if(m-i>=0){count+=dp[m-i];}}printf("%lld\n",count);// 释放内存free(arr);free(dp);return0;}

文章目录

  • 最新华为上机考试
  • 题目描述
  • 输入描述
    • 备注
  • 输出描述
  • 示例1
  • 示例2
  • 解题思路
  • Java
  • Python
  • JavaScript
  • C++
  • Go
  • C语言

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:56:12

AI产品经理实战录:如何“啃”下AI这块硬骨头

在我分享过的《B端产品从0到1全流程》等文章中&#xff0c;我反复强调“从业务中来&#xff0c;到业务中去”的核心心法。当这股无法回避的AI浪潮席卷而来时&#xff0c;我看到的不是一片需要膜拜的技术迷雾&#xff0c;而是一个个亟待用产品思维去定义、翻译和重构的真实业务问…

作者头像 李华
网站建设 2026/5/1 5:48:44

2026年专业度解析:超越代码,评估小程序定制开发公司的真实专业水平

摘要为您的业务挑选一家合适的小程序定制开发公司&#xff0c;是一个需要综合技术、服务、成本与风险的系统工程。本文旨在提供一个完全中立的决策框架&#xff0c;通过引入结构化评估维度、客观市场数据与全景品牌案例分析&#xff0c;帮助企业主与技术决策者穿透营销话术&…

作者头像 李华
网站建设 2026/5/1 5:48:52

深度学习计算机毕设之基于python深度学习的印刷体数字和字母识别基于深度学习的印刷体数字和字母识别

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

作者头像 李华
网站建设 2026/5/1 7:55:03

宏智树AI:重新定义学术写作,让论文从“难产”到“顺产”

——基于AI5.0的学术智能解决方案&#xff0c;覆盖论文全流程&#xff0c;让科研更高效 官网直达&#xff1a;http://www.hzsxueshu.com | 微信公众号&#xff1a;宏智树AI每到毕业季、课题申报期或论文投稿截止前&#xff0c;学术人总会被这些问题困扰&#xff1a;开题报告怎么…

作者头像 李华
网站建设 2026/5/1 5:48:28

基于java的SpringBoot/SSM+Vue+uniapp的就业推荐系统的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言 &#x1f31e;博主介绍&#xff1a;✌全网粉丝15W,CSDN特邀作者、211毕业、高级全…

作者头像 李华