邢台手机网站建设信息建筑设计公司经营范围
2026/4/9 3:41:50 网站建设 项目流程
邢台手机网站建设信息,建筑设计公司经营范围,建站之星 网站排名,河南省建设厅网站103号文件最新华为上机考试 真题目录#xff1a;点击查看目录 华为OD面试真题精选#xff1a;点击立即查看 2025华为od机试双机位C卷 题目描述 游乐园有一款互动游戏#xff0c;游戏开始时会提供n个宝石#xff0c;每个宝石都一个属性值a1,a2,…an.玩家在游戏前可以挑选x颗宝石点击查看目录华为OD面试真题精选点击立即查看2025华为od机试双机位C卷题目描述游乐园有一款互动游戏游戏开始时会提供n个宝石每个宝石都一个属性值a1,a2,…an.玩家在游戏前可以挑选x颗宝石将这些宝石的属性值相乘组成玩家的属性值。游戏玩家需要y点属性值请帮助游戏玩家计算有多少种计算方式。输入描述第一行三个整数n,x,y第一个整数n(0 n 20)表示宝石总数量。第二个整数x(0x n)表示可以选择宝石个数第三个整数y表示通过游戏需要的属性值第二行n个整数a1,a2,…an(-100 ai 100)表示每个宝石的属性值。输出描述输出一个整数表示玩家可以通过游戏的挑选方式的数量。示例1输入4 2 8 2 -3 4 5输出3说明解题思路这是一个经典的组合问题可以通过深度优先搜索 (DFS) / 回溯法来解决。由于宝石数量n nn较小n 20 n 20n20我们可以遍历所有可能的组合找出其中选取x xx个宝石且乘积等于y yy的方案数量。解题思路数据读取读取n , x , y n, x, yn,x,y以及n nn个宝石的属性值。回溯算法 (DFS)我们需要设计一个递归函数记录当前遍历到的宝石索引 (index)、已经选取的宝石数量 (count) 以及当前的乘积 (currentVal)。递归出口如果已经选够了x xx个宝石检查当前乘积是否等于y yy。如果是计数器加 1。无论是否相等都结束当前分支。如果遍历完了所有宝石index n但没选够x xx个结束当前分支。递归分支选择当前宝石进入下一层递归count 1乘积更新为currentVal * gems[index]。不选当前宝石进入下一层递归count不变乘积不变。数据类型虽然单个属性值在int范围内但多个数相乘可能会超出int范围建议使用long来存储乘积尽管y yy也是输入值但在中间计算过程中防止溢出是个好习惯。Javaimportjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);// 1. 读取 n, x, yif(!scanner.hasNext())return;intnscanner.nextInt();intxscanner.nextInt();intyscanner.nextInt();// 2. 读取宝石属性值long[]gemsnewlong[n];for(inti0;in;i){gems[i]scanner.nextLong();}intres0;inttotalStates1n;// 2的n次方// 3. 二进制枚举所有组合for(inti0;itotalStates;i){// 优化利用 bitCount 快速判断当前组合是否选了 x 个if(Integer.bitCount(i)!x){continue;}longprod1L;// 计算当前组合的乘积for(intj0;jn;j){// 判断二进制第 j 位是否为 1if((i(1j))!0){prod*gems[j];}}// 4. 判断条件// 根据用例1 (目标8输出3)这里必须是 大于等于// 2*48, 2*510, 4*520共3种if(prody){res;}}System.out.println(res);}}Pythonimportsys# 1. 读取 n, x, yn,x,ymap(int,input().split())# 2. 读取宝石属性值gemslist(map(int,input().split()))res0totalStates1n# 2的n次方# 3. 二进制枚举所有组合foriinrange(totalStates):# 优化利用 bit_count 快速判断当前组合是否选了 x 个ifbin(i).count(1)!x:continueprod1# 计算当前组合的乘积forjinrange(n):# 判断二进制第 j 位是否为 1if(i(1j))!0:prod*gems[j]# 4. 判断条件# 根据用例1 (目标8输出3)这里必须是 大于等于# 2*48, 2*510, 4*520共3种ifprody:res1print(res)JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});letinputLines[];rl.on(line,(line){inputLines.push(line);}).on(close,(){// 1. 读取 n, x, yconst[n,x,y]inputLines[0].split( ).map(Number);// 2. 读取宝石属性值constgemsinputLines[1].split( ).map(Number);letres0;consttotalStates1n;// 2的n次方// 3. 二进制枚举所有组合for(leti0;itotalStates;i){// 优化利用 bitCount 快速判断当前组合是否选了 x 个if(i.toString(2).split(1).length-1!x){continue;}letprod1n;// 计算当前组合的乘积for(letj0;jn;j){// 判断二进制第 j 位是否为 1if((i(1j))!0){prod*BigInt(gems[j]);}}// 4. 判断条件// 根据用例1 (目标8输出3)这里必须是 大于等于// 2*48, 2*510, 4*520共3种if(prodBigInt(y)){res;}}console.log(res);});C#includeiostream#includevectorintmain(){// 1. 读取 n, x, yintn,x;longlongy;std::cinnxy;// 2. 读取宝石属性值std::vectorlonglonggems(n);for(inti0;in;i){std::cingems[i];}intres0;inttotalStates1n;// 2的n次方// 3. 二进制枚举所有组合for(inti0;itotalStates;i){// 优化利用 __builtin_popcount 快速判断当前组合是否选了 x 个if(__builtin_popcount(i)!x){continue;}longlongprod1LL;// 计算当前组合的乘积for(intj0;jn;j){// 判断二进制第 j 位是否为 1if((i(1j))!0){prod*gems[j];}}// 4. 判断条件// 根据用例1 (目标8输出3)这里必须是 大于等于// 2*48, 2*510, 4*520共3种if(prody){res;}}std::coutresstd::endl;return0;}Gopackage main import ( fmt math/bits ) func main() { // 1. 读取 n, x, y var n, x int var y int64 fmt.Scan(n, x, y) // 2. 读取宝石属性值 gems : make([]int64, n) for i : 0; i n; i { fmt.Scan(gems[i]) } res : 0 totalStates : 1 n // 2的n次方 // 3. 二进制枚举所有组合 for i : 0; i totalStates; i { // 优化利用 bits.OnesCount 快速判断当前组合是否选了 x 个 if bits.OnesCount(uint(i)) ! x { continue } prod : int64(1) // 计算当前组合的乘积 for j : 0; j n; j { // 判断二进制第 j 位是否为 1 if (i (1 j)) ! 0 { prod * gems[j] } } // 4. 判断条件 // 根据用例1 (目标8输出3)这里必须是 大于等于 // 2*48, 2*510, 4*520共3种 if prod y { res } } fmt.Println(res) }C语言#includestdio.h#includestdlib.hintcountSetBits(intn){intcount0;while(n){countn1;n1;}returncount;}intmain(){// 1. 读取 n, x, yintn,x;longlongy;scanf(%d %d %lld,n,x,y);// 2. 读取宝石属性值longlong*gems(longlong*)malloc(n*sizeof(longlong));for(inti0;in;i){scanf(%lld,gems[i]);}intres0;inttotalStates1n;// 2的n次方// 3. 二进制枚举所有组合for(inti0;itotalStates;i){// 优化利用 countSetBits 快速判断当前组合是否选了 x 个if(countSetBits(i)!x){continue;}longlongprod1LL;// 计算当前组合的乘积for(intj0;jn;j){// 判断二进制第 j 位是否为 1if((i(1j))!0){prod*gems[j];}}// 4. 判断条件// 根据用例1 (目标8输出3)这里必须是 大于等于// 2*48, 2*510, 4*520共3种if(prody){res;}}printf(%d\n,res);free(gems);return0;}文章目录最新华为上机考试题目描述输入描述输出描述示例1解题思路解题思路JavaPythonJavaScriptCGoC语言

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询