题目
总公司拥有M台 相同 的高效设备,准备分给下属的N个分公司。
各分公司若获得这些设备,可以为国家提供一定的盈利。盈利与分配的设备数量有关。
问:如何分配这M台设备才能使国家得到的盈利最大?
求出最大盈利值。
分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。
题解
可以将每个公司分组,取1个、取两个…取m个等,这样就可以用分组背包来解决。
求方案时,可以从f[n][m]开始向前遍历,只要当前的f[i]与前一个f[i-1]取k个的值相等,那么第i个取k个就可以满足条件,则记录到way[i]中。
#include<iostream>
using namespace std;
const int N=11,M=16;
int n,m,w[N][M],f[N][M],way[M];
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++){
f[i][j]=f[i-1][j];
for(int k=1;k<=j;k++){//最少分配一台,并且k不能超过当前剩余的j台
f[i][j]=max(f[i][j],f[i-1][j-k]+w[i][k]);
}
}
}
cout<<f[n][m]<<endl;
int j=m;
for(int i=n;i;i--){
for(int k=1;k<=j;k++){
if(f[i][j]==f[i-1][j-k]+w[i][k]){
way[i]=k;
j-=k;
break;
}
}
}
for(int i=1;i<=n;i++)cout<<i<<" "<<way[i]<<endl;
return 0;
}