机器分配

传送门

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;
}
原文地址:https://www.cnblogs.com/duojiaming/p/11687054.html