司机调度问题

简介: 司机调度问题

题目

现有司机N*2人,调度中心会将所有司机平分给A、B两个区域
第 i 个司机去A可得收入为incomei,
第 i 个司机去B可得收入为incomei,
返回所有调度方案中能使所有司机总收入最高的方案,是多少钱

一、暴力递归

递归含义:index可以去A区或者B区,A区还剩rest个名额
递归basie key:
1)没有司机可以选,返回0,
2)A区名额已满,司机只能去B区
3)B区名额已满,司机只能去A去

    public static int maxMoney(int[][] income) {
        if (income == null || income.length < 2 || (income.length & 1) != 0) {
            return 0;
        }
        int N = income.length; // 司机数量一定是偶数,所以才能平分,A N /2 B N/2
        int M = N >> 1; // M = N / 2 要去A区域的人
        return process(income, 0, M);
    }

    // index.....所有的司机,往A和B区域分配!
    // A区域还有rest个名额!
    // 返回把index...司机,分配完,并且最终A和B区域同样多的情况下,index...这些司机,整体收入最大是多少!
    public static int process(int[][] income, int index, int rest) {
        if (index == income.length) {
            return 0;
        }
        // B区满了
        if (income.length - index == rest) {
            return income[index][0] + process(income, index + 1, rest - 1);
        }
        //A区满了
        if (rest == 0) {
            return income[index][1] + process(income, index + 1, rest);
        }
        // 当前司机,可以去A,或者去B
        int p1 = income[index][0] + process(income, index + 1, rest - 1);
        int p2 = income[index][1] + process(income, index + 1, rest);
        return Math.max(p1, p2);
    }

二、动态规划

dpi含义:有i个司机,A区还有j个名额,最大收入是多少
根据递归Basie Key:
递归

    if (income.length - index == rest) {
        return income[index][0] + process(income, index + 1, rest - 1);
    }

在dp中:

    if (N - i == j) {
        dp[i][j] = income[i][0] + dp[i + 1][j - 1];
    }

递归:

    if (rest == 0) {
        return income[index][1] + process(income, index + 1, rest);
    }

在dp中

    if (j == 0) {
        dp[i][j] = income[i][1] + dp[i + 1][j];
    }

总代码

    public static int maxMoney2(int[][] income) {
        int N = income.length;
        int M = N >> 1;
        int[][] dp = new int[N + 1][M + 1];
        for (int i = N - 1; i >= 0; i--) {
            for (int j = 0; j <= M; j++) {
                if (N - i == j) {
                    dp[i][j] = income[i][0] + dp[i + 1][j - 1];
                } else if (j == 0) {
                    dp[i][j] = income[i][1] + dp[i + 1][j];
                } else {
                    int p1 = income[i][0] + dp[i + 1][j - 1];
                    int p2 = income[i][1] + dp[i + 1][j];
                    dp[i][j] = Math.max(p1, p2);
                }
            }
        }
        return dp[0][M];
    }
相关文章
|
大数据 Python
使用Python查找字符串中包含的多个元素
本文介绍了Python中查找字符串子串的方法,从基础的`in`关键字到使用循环和条件判断处理多个子串,再到利用正则表达式`re模块`进行复杂模式匹配。文中通过实例展示了如何提取用户信息字符串中的用户名、邮箱和电话号码,并提出了优化策略,如预编译正则表达式和使用生成器处理大数据。
294 1
|
5月前
|
人工智能 JavaScript 前端开发
CodeBuddy重构开发:程序员的懒人进化论
本书讲述了2025年一位程序员与CodeBuddy的邂逅,开启编程新时代的故事。Craft智能体实现对话式编程,大幅缩短开发周期;MCP协议打通工具链,提升全链路效率;DeepSeek V3深度理解业务并传承编码风格。在AI辅助下,开发者从工匠转型为指挥家,技术债管理更加高效。书中指出,未来编程大师是善用AI的人,CodeBuddy成为放大人类编程理想的棱镜,展现代码优雅与智慧无限可能。
|
11月前
|
SQL 关系型数据库 数据库连接
"Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
540 0
|
分布式计算 大数据 数据处理
【Flink】Flink跟Spark Streaming的区别?
【4月更文挑战第17天】【Flink】Flink跟Spark Streaming的区别?
|
11月前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
242 2
|
11月前
|
存储 监控 安全
API接口数据获取全流程用户指南
本文介绍了从明确需求到数据存储与管理的API接口数据获取全流程。首先,明确业务需求和选择合适的数据源;接着,准备API接口,包括审查文档、申请密钥和安全存储;然后,构建与发送请求,处理响应与数据;最后,进行数据存储与管理,并持续监控与优化,确保数据的安全与合规。通过这些步骤,用户可以高效地获取和管理数据,为数据分析和业务优化提供支持。
|
机器学习/深度学习 人工智能 算法
清华接手,YOLOv10问世:性能大幅提升,登上GitHub热榜
【6月更文挑战第6天】清华大学团队推出YOLOv10,实现目标检测性能大幅提升。该算法在效率和准确性间取得更好平衡,解决NMS后处理问题,优化模型架构,减少参数和FLOPs。YOLOv10在COCO基准测试中表现出色,虽有未在大规模数据集预训练及小规模模型性能差距的局限,但已成实时检测领域重要进展,引领未来研究方向。[链接](https://arxiv.org/pdf/2405.14458)
442 1
|
开发者 Sentinel 微服务
高并发架构设计三大利器:缓存、限流和降级问题之降级策略中的有限状态机的三种状态切换的问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之降级策略中的有限状态机的三种状态切换的问题如何解决
180 0
|
消息中间件 存储 传感器
Kafka消息队列原理及应用详解
【5月更文挑战第6天】Apache Kafka是高性能的分布式消息队列,常用于实时数据管道和流应用。它提供高性能、持久化、分布式和可伸缩的消息处理,支持解耦、异步通信和流量控制。Kafka的核心概念包括Broker、Topic、Partition、Producer、Consumer和Consumer Group。其特点是高吞吐、低延迟、数据持久化、分布式架构和容错性。常见应用包括实时数据流处理、日志收集、消息传递和系统间数据交换。
|
XML 机器学习/深度学习 算法
目标检测算法训练数据准备——Penn-Fudan数据集预处理实例说明(附代码)
目标检测算法训练数据准备——Penn-Fudan数据集预处理实例说明(附代码)
435 1