【秋招笔试】09.19小米秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历

✨ 本系列打算持续跟新 春秋招笔试题

👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸

✨ 笔试合集传送们 -> 🧷春秋招笔试合集

🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新

🍄 题面描述等均已改编,如果和你笔试题看到的题面描述不一样请理解,做法和题目本质基本不变。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞

alt

🌈 小米秋招笔试,来啦!!!

🍥 本次是DP+贪心场,第二题很容易误导往DP方面想,当然也能做只不过需要优化

1️⃣ 01背包的变种,即求01背包是否能恰好装满

2️⃣ 贪心,分别枚举递增和递减的情况,有任意一种满足即可

🧸 01.K小姐的玩具 评测链接🔗

问题描述

在一个阳光明媚的下午,K小姐决定整理她的玩具。她有一个容量为 的箱子,以及 个不同大小的玩具,每个玩具的大小分别为 。除了这些玩具,K小姐还有 个大小均为 的填充物,这些填充物是她参加各种活动时的纪念品。

K小姐希望能够将这些玩具和填充物放入箱子中,恰好装满箱子,不留任何空隙。她想知道是否可以通过选择一些玩具(包括填充物)来实现这个目标。

当然,如果填充物足够多,她也可以选择用填充物完全填满整个箱子,这样也会让她感到很开心!

输入格式

第一行包含一个整数 ,表示数据组数。

对于每组数据:

第一行包含三个整数 ,分别表示箱子的容量、玩具的数量以及填充物的数量。

第二行包含 个整数 ,分别表示这 个玩具的大小。

输出格式

输出 行,分别表示每组数据的答案。

对于每组数据,如果可以恰好装满箱子,输出 "YES";否则输出 "NO"。

样例输入

2
10 4 1
2 3 5 7
10 1 3
6

样例输出

YES
NO

数据范围

  • 每组数据中,箱子的容量、玩具数量和填充物数量均在上述范围内。

题解

动态规划

这个问题实际上是一个经典的背包问题。我们需要确定是否可以选择一些玩具和填充物,使得它们的总大小恰好等于箱子的容量

动态规划:定义一个数组 dp,其中 dp[j] 表示是否可以用选定的玩具组合成大小为 的总和。初始时,dp[0]true(表示不选任何玩具时总和为0)。

状态转移:对于每个玩具,从后向前更新 dp 数组,对于当前的玩具 a[i],如果之前可以组合出大小为 j - a[i] 的总和,那么就可以组合出大小为 j 的总和。

检查结果:在更新完所有玩具后,我们检查从大到小的 dp 数组,如果存在某个 i 满足 dp[i]trueN - i <= c(即剩余空间可以用填充物填满),则返回 "YES";否则返回 "NO"。

参考代码

  • Python
def can_fill_box(N, n, c, toys):
    # 如果填充物数量足够,可以直接返回 True
    if c >= N:
        return True
    
    # 初始化动态规划数组
    dp = [False] * (N + 1)
    dp[0] = True # 不选任何东西时,总和为0
    
    # 动态规划更新 dp 数组
    for toy in toys:
        for j in range(N, toy - 1, -1):
            dp[j] = dp[j] or dp[j - toy]
    
    # 检查是否能用剩余空间填满
    for i in range(N + 1):
        if N - i <= c and dp[i]: # 如果剩余空间可以被填满
            return True
            
    return False

# 主程序入口
if __name__ == "__main__":
    T = int(input()) # 输入数据组数
    results = []
    
    for _ in range(T):
        N, n, c = map(int, input().split()) # 输入箱子容量、玩具数量和填充物数量
        toys = list(map(int, input().split())) # 输入每个玩具的大小
        
        result = "YES" if can_fill_box(N, n, c, toys) else "NO"
        results.append(result)
    
    print("\n".join(results)) # 输出结果
  • Java
import java.util.Scanner;

public class ToyBox {

    public static boolean canFillBox(int N, int n, int c, int[] toys) {
        if (c >= N) return true; // 如果填充物数量足够,可以直接返回 true
        
        boolean[] dp = new boolean[N + 1];
        dp[0] = true; // 不选任何东西时,总和为0
        
        // 动态规划更新 dp 数组
        for (int toy : toys) {
            for (int j = N; j >= toy; j--) {
                dp[j] |= dp[j - toy];
            }
        }
        
        // 检查是否能用剩余空间填满
        for (int i = N; i >= 0; i--) {
            if (N - i <= c && dp[i]) return true;
        }
        
        return false;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int T = scanner.nextInt(); // 输入数据组数
        
        while (T-- > 0) {
            int N = scanner.nextInt();
            int n = scanner.nextInt();
            int c = scanner.nextInt();
            
            int[] toys = new int[n];
            for (int i = 0; i < n; i++) {
                toys[i] = scanner.nextInt(); // 输入每个玩具的大小
            }
            
            String result = canFillBox(N, n, c, toys) ? "YES" : "NO";
            System.out.println(result); // 输出结果
        }
        
        scanner.close();
    }
}
  • Cpp
#include <bits/stdc++.h>
using namespace std;

// 函数用于判断是否可以将箱子装满
bool canFillBox(int N, int n, int c, vector<int>& toys) {
    if (c >= N) return true; // 如果填充物数量足够,可以直接返回 true
    
    vector<bool> dp(N + 1, false);
    dp[0] = true; // 不选任何东西时,总和为0
    
    // 动态规划更新 dp 数组
    for (int toy : toys) {
        for (int j = N; j >= toy; j--) {
            dp[j] |= dp[j - toy];
        }
    }
    
    // 检查是否能用剩余空间填满
    for (int i = N; i >= 0; i--) {
        if (N - i <= c && dp[i]) return true;
    }
    
    return false;
}

// 主程序入口
int main() {
    ios::sync_with_stdio(false);
    
    int T;
    cin >> T; // 输入数据组数
    
    while (T--) {
        int N, n, c;
        cin >> N 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

学长刷题笔记 文章被收录于专栏

这里收集了超全的刷题笔记,欢迎大家的订阅,会持续跟新的

全部评论
有人知道为什么第一题只能过18%吗😢感觉思路差不多,只不过输出结果的时候,我一个用例一输出的,是这个原因吗
点赞 回复 分享
发布于 09-20 14:28 上海

相关推荐

4 6 评论
分享
牛客网
牛客企业服务