当前位置: 首页 > news >正文

华为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语言

http://www.jsqmd.com/news/206901/

相关文章:

  • dy x-tt-session-dtrait 逆向分析
  • 深度学习毕设选题推荐:基于pythonCNN图像识别昆虫类别基于CNN图像识别昆虫类别
  • 毕业论文写到崩溃?宏智树AI不是“代写神器”,而是你的“全流程学术协作者”
  • JS快速让页面文本失焦,最简单,且适配
  • 文本摘要:让AI Agent提炼关键信息
  • 吐血推荐9个AI论文软件,专科生轻松搞定毕业论文!
  • 深度学习毕设项目推荐-基于cnn训练手写数字识别基于人工智能训练手写数字识别
  • AI产品经理实战录:如何“啃”下AI这块硬骨头
  • 我做美股超短两个月了有盈利,那我超短水平怎么样
  • 2026年专业度解析:超越代码,评估小程序定制开发公司的真实专业水平
  • 设备管理是操作系统的重要组成部分,主要负责协调和控制计算机系统中的输入输出(I/O)设备
  • 深度学习毕设项目推荐-基于python图像识别昆虫类别基于CNN图像识别昆虫类别
  • 宏智树AI:毕业论文的“全能导航仪”,带你从选题到定稿一路开呱!
  • 会议室这道题,考的从来不只是算法——从《Meeting Rooms》聊清“时间冲突”的本质
  • I/O 系统的层次结构与设备管理技术是操作系统中实现高效输入输出控制的核心机制
  • 开题总被导师打回?宏智树AI开题报告功能:用“科研导航仪”帮你一次过审
  • 深度学习毕设项目推荐-基于深度学习的印刷体数字和字母识别基于python深度学习的印刷体数字和字母识别
  • 缓冲技术与 Spooling 技术是操作系统中实现高效 I/O 管理的关键手段
  • 解锁 PDF 内容:如何用 Python 从 PDF 中快速提取文本
  • 【课程设计/毕业设计】基于机器学习训练手写数字识别 python基于cnn训练手写数字识别
  • 设备管理是操作系统的重要组成部分,其定位在于协调和控制计算机系统中的各类硬件设备
  • 宏智树AI如何用“智能三板斧”搞定选题、框架与文献?
  • 芒果病害数据集6593张VOC+YOLO格式(已增强)
  • 基于java的SpringBoot/SSM+Vue+uniapp的校园心理咨询系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 全网最全MBA必看TOP8AI论文写作软件测评
  • 深度学习毕设选题推荐:基于cnn训练手写数字识别基于机器学习训练手写数字识别
  • 编写好的代码,AI 才会奖励你
  • 床单污渍检测数据集3935张VOC+YOLO格式
  • Python入门筑基指南!!!
  • 2026最新全网6种方法教你如何关闭Win10/Windows11系统自动更新,一键彻底关闭win11系统自动更新