news 2026/5/1 3:28:32

华为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/5/1 9:57:50

BT300-00754-12伺服驱动器

BT300-00754-12 伺服驱动器是一种工业自动化设备&#xff0c;用于对伺服电机进行精准控制&#xff0c;实现高速、高精度的运动控制。它广泛应用于机械自动化、生产线以及精密设备。BT300-00754-12 伺服驱动器 — 产品特点与应用领域产品特点&#xff1a;高精度控制&#xff1a;…

作者头像 李华
网站建设 2026/5/1 9:29:06

ArcGIS Pro 从入门到实战基础篇(11):打开栅格

在地理信息系统&#xff08;GIS&#xff09;工作中&#xff0c;栅格数据是最常见的数据类型之一&#xff0c;广泛应用于遥感影像、DEM、高程分析和专题制图等场景。 ArcGIS Pro 作为新一代桌面 GIS 平台&#xff0c;提供了多种灵活、直观的方式来加载和管理栅格文件。 打开离…

作者头像 李华
网站建设 2026/4/23 14:31:35

项目经理什么水平,就看这一点!

想要跳槽到其他公司去&#xff0c;面试是HR了解项目经理的重要机会&#xff0c;那在短短几十分钟的面试中&#xff0c;HR要如何判断一个项目经理的真实水平呢&#xff1f; 其实判断项目经理行不行&#xff0c;根本不用搞复杂测评&#xff0c;HR抓准一个核心点就行。 1.HR判断…

作者头像 李华
网站建设 2026/4/19 23:33:10

谐波检测之瞬时无功功率理论 ip-iq 检测法:从原理到实践

谐波检测瞬时无功功率理论ipiq检测法在电力系统的复杂世界里&#xff0c;谐波问题一直是让人头疼的存在。谐波不仅会降低电能质量&#xff0c;还可能对各种电气设备造成损害。而瞬时无功功率理论中的 ip - iq 检测法&#xff0c;就如同一位可靠的侦探&#xff0c;能够精准地找出…

作者头像 李华
网站建设 2026/4/16 12:30:34

Java毕设选题推荐:基于springboot的健身服务管理系统健身、健身房、健身会员等项目。【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华