DP练习 - 机器分配

题目描述

某总公司拥有高效生产设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为总公司提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。分配原则:每个公司有权获得任意数目的设备,但总台数不得超过总设备数M。其中M<=100,N<=100。

输入

第一行为两个整数M,N。接下来是一个N×M的矩阵,其中矩阵的第i行的第j列的数Aij表明第i个公司分配j台机器的盈利。所有数据之间用一个空格分隔。

输出

只有一个数据,为总公司分配这M台设备所获得的最大盈利。

样例输入

3 2
1 2 3
2 3 4

样例输出

4


题意比较容易理解,枚举每种公司数量和每种机器数量的情况。

注意:每次的机器数量情况又要枚举是否在某一公司的机器增加到一定数量时产生更优的解

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int pro[105][105];
int ans[105][105];

int main()
{
    int m, n;

    while (scanf("%d%d", &m, &n) != EOF)
    {
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= m; ++j)
                scanf("%d", &pro[i][j]);

        memset(ans, 0, sizeof(ans));
        ans[1][1] = pro[1][1];
        for (int i = 1; i <= n; ++i)
        {
            ans[i][1] = ans[i-1][1];
            for (int j = 1; j <= m; ++j)
                for (int k = 0; k <= j; ++k)
                    ans[i][j] = max(ans[i][j], ans[i-1][j-k] + pro[i][k]);
        }
        printf("%d\n", ans[n][m]);
    }
    return 0;
}


### 参加睿抗机器人开发者大赛所需的学习内容和技能要求 #### 学习内容 为了成功参与并取得优异成绩,在准备过程中需掌握一系列理论和技术知识。主要包括但不限于以下几个方面: - **编程基础**:熟练掌握至少一种主流编程语言,如Python、C++或Java等。这些语言广泛应用于算法实现与软件开发中[^1]。 - **数据结构与算法设计**:深入理解常见数据结构(链表、栈、队列、树形结构等),以及经典算法的设计思路及其应用场景,例如动态规划中的01背包问题[^3]。 - **人工智能基础知识**:了解机器学习基本概念及其实现方法;熟悉神经网络原理及其训练过程;能够运用开源框架TensorFlow/Keras完成简单的AI项目构建。 - **硬件控制技术**:对于涉及物理设备操作的比赛环节,则需要具备一定的电子电路常识,并能通过Arduino/STM32等相关单片机平编写程序来驱动传感器或其他外设工作。 #### 技能要求 参赛选手除了要拥有扎实的专业背景之外,还需要培养以下几项软实力: - **团队协作能力**:大多数竞赛都是以小组形式展开竞争,因此成员间良好的沟通交流至关重要。要学会倾听他人意见,共同探讨解决方案,合理分配任务,提高整体效率[^2]。 - **快速学习适应力**:面对不断变化的技术环境和社会需求,保持持续进步的心态非常重要。能够在短时间内吸收新知,灵活调整策略应对挑战是优秀程序员必备素质之一。 - **创新思维模式**:鼓励学生跳出传统思维方式局限,勇于尝试新鲜事物,敢于质疑现有结论,从而创造出更具价值的作品和服务。 #### 比赛准备建议 针对上述提到的各项要点,以下是具体的备考指南: - 定期关注官方发布的最新资讯,及时获取赛事规则变动情况; - 积极参加线上线下的培训课程,加深对特定领域知识点的理解程度; - 多与其他爱好者互动交流心得体验,借鉴他人的实战经验教训; - 利用课余时间多动手实践练习题目案例,巩固所学理论成果的同时提升实际解决问题的能力。 ```python # 示例代码展示如何解决一个简化版的01背包问题 def knapsack(weights, values, capacity): n = len(values) dp = [[0]*(capacity+1) for _ in range(n+1)] for i in range(1,n+1): for w in range(capacity+1): if weights[i-1]<=w: dp[i][w]=max(dp[i-1][w],dp[i-1][w-weights[i-1]]+values[i-1]) else: dp[i][w]=dp[i-1][w] return dp[-1][-1] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值