算法提高之机器分配
-
核心思想:分组背包 + dfs求最短路
- 1.再每一个组中取一个利润 求最大(分组背包)
- 2.dfs求最短路:每一个f[i][j]都是有f[i-1][k]转移得到 所以遍历所有f[i-1][k],找到最大利润路线中的方案
- 然后递归
-
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 20; int f[N][N],w[N][N]; int path[N]; int n,m,cnt; void dfs(int u,int v) { if(!u) return; for(int j=0;j<=v;j++) //遍历所有k --> 遍历所有的f[i-1][k] { if(f[u-1][v-j] + w[u][j] == f[u][v]) .//找到最大利润中的方案 { path[cnt++] = j; dfs(u-1,v-j); return; } } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>w[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<=j;k++) //遍历所有能取的k 每个都求一次最值 f[i][j] = max(f[i][j],f[i-1][j-k] + w[i][k]); cout<<f[n][m]<<endl; dfs(n,m); for(int i=cnt-1,id=1;i>=0;i--,id++) { cout<<id<<" "<<path[i]<<endl; } }