原题链
解题思路:
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\n",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\n",ans[n][m]);
print(n,m);
return 0;
}
原文地址:https://www.cnblogs.com/czy--blog/p/11741841.html
时间: 2024-10-29 01:00:01