LuoguP2066机器分配

总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值和分配方案。其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。
dp[i][j] := 前i个公司分配j台机器的最大收益

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#define N 100 
using namespace std;
int dp[N][N],v[N][N],n,m,ans;
void dfs(int i,int j){
    if(i == 0) return;
    for(int k = 0;k <= j;++k){
        if(ans == dp[i-1][k] + v[i][j-k]){
            ans = dp[i-1][k];
            dfs(i-1,k);
            printf("%d %d
",i,j-k);
            return;
        }
    }
}
void solve(){
    for(int i = 1;i <= n;++i){
        for(int j = 1;j <= m;++j){
            ans = 0;
            for(int k = 0;k <= j;++k){
                if(ans < dp[i-1][k] + v[i][j-k]){
                    ans = dp[i-1][k] + v[i][j-k];
                }
            }
            dp[i][j] = ans;
        }
    }
    printf("%d
",dp[n][m]);
    dfs(n,m);
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i = 1;i <= n;++i){
        for(int j = 1;j <= m;++j){
            scanf("%d",&v[i][j]);	
        }
    }
    solve();
    return 0;
}
岂能尽如人意,但求无愧我心
原文地址:https://www.cnblogs.com/Zforw/p/10543277.html