题解-Hnoi1995 资源分配

该博客探讨了如何在n个公司中有效地分配m台机器以实现最大利润的问题。通过描述和解析,给出了一个样例输入输出,展示了当有3台机器分配给2个公司时的最优解。博主提出了一种递推思想来解决这个问题,确定了状态转移方程,旨在求出最大利润及其分配方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

描述

已知第j个公司使用k台机器时,能得到的利润为a[j,k],问如何将m台机器在n个公司中分配,才能获得最大利润?要求输出能获得的最大利润及方案.将3台机器分配给2个公司能获得的盈利情况如下:
15946273199597.png

最大盈利为6,方案为公司2使用2台,公司1使用1台.

输入
第1行n,m 分别表示公司数和机器数
第2至第n+1行分别表示第i个公司分别使用每台机器的盈利情况,可结合题目描述进行理解
机器数m<=300,
公司数n<=300;
最大总利润不超过longint范围

输出
最大的盈利值为多少

样例
输入
2 3
2 3 4
1 4 5
输出
6


解析

首先看题目,对于分配给前i个公司j台机器的价值,实际上相当于前i-1个公司分配k台机器并给第i个公司分配j-k台机器的价值总和,那么我们推出状态转移方程:

 f[i][j]=max(f[i][j],f[i-1][j-k]+v[i][k]);

我们用递推的思想求出这个核心部分。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,v[1000][1000],f[1000][1000];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=m;j++){
      		cin>>v[i][j];
      	}
    }
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=m;j++){
      		for(int k=0;k<=j;k++){
     			f[i][j]=max(f[i][j],f[i-1][j-k]+v[i][k]);
   			}
   		}
   }
    cout<<f[n][m];
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值