news 2026/2/23 16:19:07

华为OD机试双机位C卷 - 零食奖励 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试双机位C卷 - 零食奖励 (C++ Python JAVA JS GO)

零食奖励

2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型

华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解

题目描述

小朋友考试得第一名就可以得到零食奖励。现在价格A、B、C、D、E、…,元商品名A1、B1、C1、D1、E1、…,小朋友的喜爱度依次为A2、B2、C2、D2、E2、…。请返回选取x元零食可以达到的最大喜爱度。

输入描述

第一行输入为x和N,x为可使用的钱的总额,N为零食种类数。

0 ≤ x ≤ 1000
0 ≤ N ≤ 100

第二行开始为零食属性,每行有三个整型数值,分别代表零食的价格、数量和喜爱度。

零食价格(0,100)
零食个数[0,10000]
零食喜爱度[0,10000]

输出描述

最大喜爱度

用例1

输入

10 2 2 4 3 3 3 4

输出

14

说明

可选第1种零食最多 4 个,第2种最多 3 个。最佳选择为:选 2 个第2种(花费 6 元,喜爱度 8)和 2 个第1种(花费 4 元,喜爱度 6),总计花费 10 元,总喜爱度 14。输出 14。

用例2

输入

6 7 3 1 8 4 1 2 3 1 1 9 1 7 4 1 1 5 1 8 4 1 4

输出

9

说明

6元可以购买两个3元的零食,喜爱度综合为8+1=9

题解

思路:多重背包问题

  1. 多重背包问题的典型题,相比于普通背包问题,多加了数量的限制,如果数据量小于 10^2可以将多重背包转换为普通背包也没问题,但是本题大于这个数量级所以需要进行多重背包二进制优化来处理这个问题。
  2. 二进制优化的逻辑如下: 本质上利用的原理是十进制数 都可以由一个或多个2^x数表示。优化逻辑 例如count为10,使用普通背包会拆分为10个1{1,1,1,1,1,1,1,1,1,1}, 使用二进制拆分会被拆分为{1,2,4}只会拆分为3个注意这样拆分之后对应喜爱度和成本也会 * 拆分对应值,所以能减少将拆分复杂度从O(count) -> O(log count)
  3. 明白2的定理之后,接下来就和普通背包处理一致,定义dp[x + 1], dp[i]代表i的金额能获得最大喜爱度。然后循环遍历每个零食,然后使用二进制拆分优化,然后使用普通背包进行处理就可。对应状态方程为dp[j] = max(dp[j], dp[j - cost] + value)
  4. 根据3的逻辑处理所有零食之后,输出的dp[x]就是结果。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; int main() { int x, n; cin >> x >> n; // dp[i]代表i元能获得的最大喜爱度 vector<int> dp(x + 1, 0); for(int i = 0; i < n; i++) { int price,count,love; cin >> price >> count >> love; // 二进制优化多重背包 for (int k = 1; count > 0; k <<=1) { int cnt = min(k, count); int cost = cnt * price; int value = cnt * love; count -= cnt; for (int j = x; j >= cost; j--) { dp[j] = max(dp[j], dp[j- cost] + value); } } } cout << dp[x] << endl; return 0; }

JAVA

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); // 总钱数 int n = sc.nextInt(); // 食物种类 int[] dp = new int[x + 1]; // dp[i]表示花i元能获得的最大喜爱度 for (int i = 0; i < n; i++) { int price = sc.nextInt(); int count = sc.nextInt(); int love = sc.nextInt(); // 二进制优化多重背包 for (int k = 1; count > 0; k <<= 1) { int cnt = Math.min(k, count); int cost = cnt * price; int value = cnt * love; count -= cnt; for (int j = x; j >= cost; j--) { dp[j] = Math.max(dp[j], dp[j - cost] + value); } } } System.out.println(dp[x]); } }

Python

x,n=map(int,input().split())dp=[0]*(x+1)# dp[i]表示花i元能获得的最大喜爱度for_inrange(n):price,count,love=map(int,input().split())# 二进制优化多重背包k=1whilecount>0:cnt=min(k,count)cost=cnt*price value=cnt*love count-=cnt k<<=1forjinrange(x,cost-1,-1):dp[j]=max(dp[j],dp[j-cost]+value)print(dp[x])

JavaScript

constreadline=require("readline");constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinputLines=[];rl.on("line",line=>{inputLines.push(line.trim());});rl.on("close",()=>{let[x,n]=inputLines[0].split(" ").map(Number);letdp=Array(x+1).fill(0);for(leti=0;i<n;i++){let[price,count,love]=inputLines[i+1].split(" ").map(Number);// 二进制优化多重背包letk=1;while(count>0){letcnt=Math.min(k,count);letcost=cnt*price;letvalue=cnt*love;count-=cnt;k<<=1;for(letj=x;j>=cost;j--){dp[j]=Math.max(dp[j],dp[j-cost]+value);}}}console.log(dp[x]);});

Go

packagemainimport("bufio""fmt""os")funcmain(){reader:=bufio.NewReader(os.Stdin)varx,nintfmt.Fscan(reader,&x,&n)dp:=make([]int,x+1)// dp[i]表示花i元能获得的最大喜爱度fori:=0;i<n;i++{varprice,count,loveintfmt.Fscan(reader,&price,&count,&love)// 二进制优化多重背包k:=1forcount>0{cnt:=min(k,count)cost:=cnt*price value:=cnt*love count-=cnt k<<=1forj:=x;j>=cost;j--{ifdp[j]<dp[j-cost]+value{dp[j]=dp[j-cost]+value}}}}fmt.Println(dp[x])}funcmin(a,bint)int{ifa<b{returna}returnb}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/20 19:10:03

凯云--便携式响应时间测试仪ETest_Time

1&#xff09;产品简介便携式响应时间测试仪用于系统响应时间的自动化验证&#xff0c;可自动记录从测试驱动信号触发到系统输出信号产生的时间差&#xff0c;即系统响应时间&#xff0c;可自动重复&#xff0c;多次执行个测试项并可自动绘制响应曲线&#xff0c;以及测试置信度…

作者头像 李华
网站建设 2026/2/4 3:55:34

【Open-AutoGLM应用场景揭秘】:5大行业落地案例深度解析

第一章&#xff1a;Open-AutoGLM应用场景概述Open-AutoGLM 是一个面向通用语言模型自动化任务的开源框架&#xff0c;专为简化自然语言处理&#xff08;NLP&#xff09;流程而设计。它支持从数据预处理、模型微调到推理部署的一体化操作&#xff0c;适用于多种实际业务场景。智…

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

Java 扫雷小游戏:从源代码到玩法解析,小白做游戏,收藏这篇就够了

引言 Java扫雷小游戏是一种经典的单人益智游戏&#xff0c;通过挖掘地雷以外的方块&#xff0c;以找到地雷并保持自己的生命。本文将详细介绍Java编写的扫雷小游戏源代码&#xff0c;深入讲解实现过程、代码结构和游戏玩法。 1. 扫雷游戏的基本规则 在开始编写源代码之前&a…

作者头像 李华
网站建设 2026/2/16 22:31:09

为什么你的Mac跑不动Open-AutoGLM?这3个关键配置90%的人都忽略了

第一章&#xff1a;为什么你的Mac跑不动Open-AutoGLM&#xff1f;这3个关键配置90%的人都忽略了许多开发者在尝试本地运行 Open-AutoGLM 时&#xff0c;发现即使搭载 M1/M2 芯片的 Mac 也会出现卡顿、崩溃或无法启动的情况。问题往往不在于模型本身&#xff0c;而在于系统底层的…

作者头像 李华
网站建设 2026/2/19 7:31:52

Mac用户必看:Open-AutoGLM本地部署避坑指南(90%人忽略的细节)

第一章&#xff1a;Open-AutoGLM 本地部署前的必知事项在将 Open-AutoGLM 部署至本地环境之前&#xff0c;需充分了解其运行依赖、硬件要求及配置规范&#xff0c;以确保服务稳定高效运行。该模型对计算资源有较高要求&#xff0c;合理规划资源配置是成功部署的关键。系统与环境…

作者头像 李华
网站建设 2026/2/21 0:35:22

揭秘Open-AutoGLM本地部署全流程:5步实现私有化大模型运行

第一章&#xff1a;揭秘Open-AutoGLM本地部署全流程Open-AutoGLM 是基于 AutoGLM 架构开发的开源自动化语言模型工具&#xff0c;支持本地化部署与私有化调用&#xff0c;适用于企业级数据处理与智能问答场景。通过本地部署&#xff0c;用户可在无外网依赖的环境中实现模型推理…

作者头像 李华