• P2066 机器分配


    题目背景

    题目描述

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

    输入输出格式

    输入格式:

    第一行有两个数,第一个数是分公司数N,第二个数是设备台数M。

    接下来是一个N*M的矩阵,表明了第 I个公司分配 J台机器的盈利。

    输出格式:

    第1行为最大盈利值

    第2到第n为第i分公司分x台

    P.S.要求答案的字典序最小

    输入输出样例

    输入样例#1: 
    3 3
    30 40 50
    20 30 50
    20 25 30
    输出样例#1: 
    70
    1 1
    2 1
    3 1

    Solution:

      一道简单的$DP$,本题很容易定义出状态$f[i][j]$表示前$i$个公司分配了$j$个机器的最大值,那么状态转移方程:$f[i][j]=max(f[i][j],f[i-1][k]+w[i][j-k]),kin[0,j]$,至于输出方案,直接在每次更新后同步记录一下当前公司分配的个数,最后递归输出就$OK$了。

    代码:

    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define Max(a,b) (a)>(b)?(a):(b)
    #define f_for(a,b,i) for(int (i)=(a);(i)<=(b);(i)++)
    using namespace std;
    int n,m,a[25][25],cnt,f[25][25],path[25][25];
    il void print(int i,int j){
        if(!i)return;
        print(i-1,j-path[i][j]);
        cout<<i<<' '<<path[i][j]<<endl;
    }
    int main(){
        ios::sync_with_stdio(0);
        cin>>n>>m;
        f_for(1,n,i)f_for(1,m,j)cin>>a[i][j];
        f_for(1,n,i) f_for(1,m,j) f_for(0,j,k)
            if(f[i-1][k]+a[i][j-k]>f[i][j])f[i][j]=f[i-1][k]+a[i][j-k],path[i][j]=j-k;
        cout<<f[n][m]<<endl;
        print(n,m);
        return 0;
    }
  • 相关阅读:
    坚持--从今天开始
    51系列单片机的精确延时的解释(文章如有问题之处,请劳烦指正,谢谢!) 可以看看采纳下。
    利用宏定义实现C++程序在Unix和Win32环境下的通用性
    [转]浅谈C++指针直接调用类成员函数
    类间调用inline函数的效率
    C++ inline函数与编译器设置
    GNU的makefile文件编写说明
    Windows Live Writer 2012 Test
    测试Windows Live Writer
    Mathematica学习笔记2
  • 原文地址:https://www.cnblogs.com/five20/p/8970877.html
Copyright © 2020-2023  润新知