zoukankan      html  css  js  c++  java
  • 【动态规划】机器分配

    问题 J: 【动态规划】机器分配

    时间限制: 1 Sec  内存限制: 64 MB
    提交: 7  解决: 4
    [提交] [状态] [讨论版] [命题人:]

    题目描述

    魔法学院购进高效生产设备M台以转换魔法石能量,准备分给学院的N个小组。各小组若获得这些设备,可以为学院提供一定的魔法石能量。问:如何分配这M台设备才能使魔法石能量最大?求出最大魔法石能量值。其中M≤15,N≤10。分配原则:每个小组有权获得任意数目的设备,但总台数不得超过总设备数M。

    输入

    第一行保存两个数,第一个数是设备台数M,第二个数是小组数N。接下来是一个M×N的矩阵,表明了第I个小组分配J台机器生产的魔法石能量。

    输出

    输出所有小组能产生的最大魔法石能量和

    样例输入

    3 3
    30 40 50
    20 30 50
    20 25 30
    

    样例输出

    70
    
    分析:dp[i][j]表示前i个公司分配j台机器最大盈利,MAP[i][j]表示第i个公司分配j台机器的盈利,状态转移方程为:dp[i][j]=max(dp[i-1][k]+MAP[i][j-k],dp[i][j])
    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <map>
    #define range(i,a,b) for(int i=a;i<=b;++i)
    #define LL long long
    #define rerange(i,a,b) for(int i=a;i>=b;--i)
    #define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
    using namespace std;
    int n,m,MAP[20][20],dp[20][20];
    void init(){
        cin>>n>>m;
        range(i,1,n)range(j,1,m)cin>>MAP[i][j];
    }
    void solve(){
        range(i,1,n)range(j,1,m){
                int mx=0;
                range(k,0,j)mx=max(mx,dp[i-1][k]+MAP[i][j-k]);
                dp[i][j]=mx;
            }
        cout<<dp[n][m]<<endl;
    }
    int main() {
        init();
        solve();
        return 0;
    }
    View Code
  • 相关阅读:
    JAVA周二学习总结
    2019春总结作业
    第十二周作业
    第十一周作业
    第十周作业
    第九周作业
    第八周作业
    第七周作业
    第六周作业
    第四周课程总结&试验报告(二)
  • 原文地址:https://www.cnblogs.com/Rhythm-/p/9347690.html
Copyright © 2011-2022 走看看