标签:
PS:洛古P2066
思路:
f[i][j]表示前i个公司分配j台机器能得到的最大收益
c[i][j]表示第i个公司分配j台机器能得到的最大收益(注意i和j的区别)
这样就可以从上往下推
第三重循环控制变量k为前i-1个公司分配的机器数,
那么显然第i各公司能分到j-k台机器
转移:f[i][j]=max(f[i][j],f[i-1][k]+c[i][j-k])
关于输出第几个公司分几台机器,
我们发现在动规里很难记录状态,所以采取递归搜索的方式
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int c[11][16],f[11][16],maxl; 5 int max(int,int); 6 void find(int,int); 7 int main(){ 8 int n,m; 9 scanf("%d %d",&n,&m); 10 for (int i=1;i<=n;i++) 11 for (int j=1;j<=m;j++) 12 scanf("%d",&c[i][j]); 13 for (int i=1;i<=n;i++) 14 for (int j=1;j<=m;j++) 15 for (int k=0;k<=j;k++) 16 f[i][j]=max(f[i][j],f[i-1][k]+c[i][j-k]); 17 printf("%d\n",f[n][m]); 18 maxl=f[n][m]; 19 find(n,m); 20 return 0; 21 } 22 int max(int x,int y){ 23 return x>y?x:y; 24 } 25 void find(int i,int j){ 26 if (i==0) return; 27 for (int k=0;k<=j;k++) 28 if (maxl==f[i-1][k]+c[i][j-k]){ 29 maxl=f[i-1][k]; 30 find(i-1,k); 31 printf("%d %d\n",i,j-k); 32 break; 33 } 34 }
标签:
原文地址:http://www.cnblogs.com/Absolute-Zero/p/5852336.html