dp题
因为想要得到n个分公司分配m个设备时的最有解
所以我们定义数组f[i][j] 表示前i个公司分配j台机器时的最优
接下来考虑转移
因为前i家公司只会受到前i-1家的影响
所以转移就是
f[i][j]=max(f[i][j],f[i-1][j-k]+a[i][k])
如何得到第i家公司的机器数呢?
我们考虑根据答案倒推
具体看代码
//机器分配 #include<bits/stdc++.h> using namespace std; int f[20][20],a[20][20],maxx; int print(int i,int j){ if(i==0) return 0; for(int k=0;k<=j;k++){ if(maxx==f[i-1][k]+a[i][j-k]){ maxx=f[i-1][k]; print(i-1,k); printf("%d %d ",i,j-k); break; } } } int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>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++){ f[i][j]=max(f[i][j],f[i-1][j-k]+a[i][k]); } } } printf("%d ",f[n][m]); maxx=f[n][m]; print(n,m); return 0; }