#include<iostream>
#include<algorithm>
using namespace std;
const int N = 11, M = 16;
int n, m;
int f[N][M];
int w[N][M];//w[i][j]记录的是第i个公司分配j太设备是的盈利
int way[N];
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 = 0; j <= m; j ++ ){//枚举体积
for(int k = 0; k <= j; k ++ ){//将每个物品的体积视为1 ,k = 0就是考虑了不放第i个物品的情况
f[i][j] = max(f[i][j], f[i - 1][j - k] + w[i][k]);//放入第i个物品,且放入的个数为k(给第i个公司分k台设备)
}
}
}
cout<<f[n][m]<<endl;
int j = m;//j表示背包剩余容积(当前的设备总数量)
for(int i = n; i; i -- ){//找上一个状态需要按状态转移的逆序
for(int k = 0; k <= j; k ++ ){//枚举的是第i个公司分配k个设备
if(f[i][j] == f[i - 1][j - k] + w[i][k]){//等式成立表示状态i是由i公司分配k个设备转移得到的
way[i] = k;//记录第i个公司分配了k个设备
j -= k;//背包剩余体积-k(剩余设备数量-k)
break;
}
}
}
for(int i = 1; i <= n; i ++ ) cout<<i<<" "<<way[i]<<endl;
return 0;
}
AcWing 1013 机器分配 题解 (动态规划—DP—背包问题)
最新推荐文章于 2023-01-23 22:37:14 发布