[题解]机器分配

原题链

解题思路:

DP, f([i][j])表示前(i)个公司分配(j)台机器所取得的最大利润。当前的最大利润为:前(i - 1)个公司分配(k)台机器所取得的最大利润加上当前第(i)个公司分配(j - k)台机器所取得的利润的总和,与之前取得的最大利润的较大值。所以可以得出:
maxx = max(ans[i - 1][k] + value[i][j - k],maxx);
a[i][j] = maxx;

---------------------------分析完毕--------------------------

源代码

#include <bits/stdc++.h>
using namespace std;
int a[50][50],ans[50][50],p[50],maxx;
inline int print(int i,int j){
	if(i == 0)return 0;
	for(int k = 0;k <= j;k++){
		if(maxx == ans[i - 1][k] + a[i][j - k]){
			maxx = ans[i - 1][k];
			print(i - 1,k);
			printf("%d %d
",i,j - k);
			break;
		}
	}
}
int main(){
	int n,m;
	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++){
			maxx = 0;
			for(int k = 0;k <= j;k++){
				maxx = max(ans[i - 1][k] + a[i][j - k],maxx);
				ans[i][j] = maxx;
			}
		}
	}
	printf("%d
",ans[n][m]);
	print(n,m);
	return 0;
} 
原文地址:https://www.cnblogs.com/czy--blog/p/11741841.html