【秋招笔试】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 上海

相关推荐

点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
4 6 评论
分享
牛客网
牛客企业服务