洛谷 P2066 机器分配

探讨在有限设备资源下,如何最优分配给不同分公司,以实现国家整体最大盈利目标,涉及分配策略与数学优化原理。
 题目背景 Background
 题目描述 Description
总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。
 输入输出格式 Input/output
输入格式:
第一行有两个数,第一个数是分公司数N,第二个数是设备台数M。
接下来是一个N*M的矩阵,表明了第 I个公司分配 J台机器的盈利。
输出格式:
第1行为最大盈利值
第2到第n为第i分公司分x台
 输入输出样例 Sample input/output
样例测试点#1
输入样例: 

3 3
30 40 50
20 30 50
20 25 30

输出样例:

70
1 1
2 1
3 1

代码:

/*注意矩阵的含义:不是一个机器,而是同时拥有多个机器的收益*/
#include<iostream>
using namespace std;
#include<cstdio>
int n,m,a[11][16],f[11][16];
int sum[11];
void input()
{
    scanf("%d%d",&n,&m);//n company m jiqi 
    for(int i=1;i<=n;++i) 
    {
          for(int j=1;j<=m;++j)
              scanf("%d",&a[i][j]);
              
          f[i][1]=max(a[i][1],f[i-1][1]);
    }
    for(int i=1;i<=m;++i)
    f[1][i]=a[1][i];
}
void dp()
{
    for(int i=2;i<=n;++i)
      for(int j=1;j<=m;++j)
        for(int t=1;t<=j;++t)
         {
              if(f[i][j]>f[i-1][t]+a[i][j-t]) continue;
             f[i][j]=f[i-1][t]+a[i][j-t];
             sum[i]=j-t;/*记录第i个公司有多少机器*/
         }
    int N=0;
    for(int i=2;i<=n;++i)
    N+=sum[i];
    sum[1]=m-N;
    cout<<f[n][m]<<endl;
    for(int i=1;i<=n;++i)
    printf("%d %d\n",i,sum[i]);
}
int main()
{
    input();
    dp();
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/c1299401227/p/5325118.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值