news 2026/1/16 21:34:40

华为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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/31 12:50:30

智谱清言Open-AutoGLM插件上线:开发者必须了解的8大功能特性

第一章&#xff1a;智谱清言Open-AutoGLM插件概述Open-AutoGLM 是智谱清言推出的一款面向自动化自然语言任务处理的开源插件&#xff0c;旨在降低大模型应用开发门槛&#xff0c;提升任务执行效率。该插件基于 GLM 大模型架构&#xff0c;支持任务自动规划、工具调用与多步推理…

作者头像 李华
网站建设 2026/1/14 4:48:46

【大模型私有化部署新突破】:Open-AutoGLM本地环境搭建全解析

第一章&#xff1a;Open-AutoGLM本地搭建背景与意义随着大语言模型在自动化推理、代码生成和自然语言理解等领域的广泛应用&#xff0c;本地化部署高性能开源模型成为开发者和研究团队的重要需求。Open-AutoGLM 作为基于 AutoGLM 架构的开放实现&#xff0c;支持高效的语言理解…

作者头像 李华
网站建设 2026/1/13 11:11:29

超纯水中的有机物用什么来表征?含量有多少?怎么去除?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;超纯水中的有机物用什么来表征&#xff1f;含量有多少&#xff1f;怎么去除&#xff1f;用什么来反馈水中有机物&#xff1f;如上图&a…

作者头像 李华
网站建设 2026/1/16 10:19:47

Open-AutoGLM在Mac上跑不动?这5个关键步骤让你一次成功

第一章&#xff1a;Open-AutoGLM在Mac上跑不动&#xff1f;这5个关键步骤让你一次成功 许多开发者在尝试于本地Mac环境运行 Open-AutoGLM 时&#xff0c;常遇到依赖冲突、模型加载失败或性能瓶颈等问题。通过系统性排查与优化配置&#xff0c;可以显著提升部署成功率。以下是确…

作者头像 李华