题目

总公司拥有M台 相同 的高效设备,准备分给下属的N个分公司。

各分公司若获得这些设备,可以为国家提供一定的盈利。盈利与分配的设备数量有关。

问:如何分配这M台设备才能使国家得到的盈利最大?

求出最大盈利值。

分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。
acwing1013. 机器分配

题解

可以将每个公司分组,取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;
}