题解:机器分配

题目

题目描述

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

输入格式

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

输出格式

第1行为最大盈利值
第2到第n为第i分公司分x台

解析

核心

这道题我们可以开一个dp[i][j]表示到第i个公司一共放了j台机器,那么首先是一个基本的双层循环,在最内层的里面,我们从0到j枚举k,表示在这个公司我们放了几台电脑,易得状态转移方程:
dp[i][j] = max(dp[i][j],dp[i - 1][j - k] + a[i][k]);

记录路径

接下来是记录路径
制造一个递归,从后往前扫,如果找到匹配的数就输出,继续往上跳,即可

完整代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
int biao;
int a[1001][10001];
int dp[1001][1001];
int path[1001][10001];
void print(int x,int y){
if(x == 0) return;
for(int k = 0;k <= y; k++){
	if(biao == dp[x - 1][k] + a[x][y - k]){
		biao = dp[x - 1][k];
		print(x - 1,k);
		printf("%d %d\n" ,x,y - k);
		break;
	}
}
}
int main(){
scanf("%d %d" ,&n,&m);
for(int i = 1;i <= n; i++){
	for(int j = 1;j <= m; j++){
		scanf("%d" ,&a[i][j]);
	}
}
for(int i = 1;i <= n; i++){
	for(int j = 1;j <= m; j++){
		for(int k = 0;k <= j; k++){
			dp[i][j] = max(dp[i][j],dp[i - 1][j - k] + a[i][k]);
		}
	}
}
printf("%d\n" ,dp[n][m]);
print(n,m);
return 0;
}
posted @ 2021-04-29 20:46  24Kmagic  阅读(429)  评论(0)    收藏  举报