资源分配问题的动态规划解法
假设工程项目总数为 n,可利用的资源份额总数为 m,给每项工程投入的资
源份额数不同时,所获得的利润也不同。要我们怎么分配资源以获取最大利润
#include <bits/stdc++.h>
using namespace std;
const int maxn = 50;
int m, n;
int G[maxn+1][maxn+1];
// 需要两个记忆化数组
int dp[maxn+1][maxn+1]; // 表示给前i个项目分配j个资源的最大利润
int d[maxn+1][maxn+1]; // 表示使得dp[i][j]最大时,第i个项目分配的资源数
void solve()
{
//初始化
for(int i = 1; i <= m; ++i) {
dp[1][i] = G[1][i];
d[1][i] = i;
}
for(int i = 2; i <= n; ++i) {
for(int j = 0; j <= m; ++j) {
for(int k = 0; k <= j; ++k) {
int t = dp[i-1][k] + G[i][j-k];
if(dp[i][j] < t) {
dp[i][j] = t;
d[i][j] = j - k;
}
}
}
}
int cnt = m;
for(int i = n; i >= 1; --i) {
printf("the %d project allocate %d resources
", i, d[i][cnt]);
cnt -= d[i][cnt];
}
cout << "The biggest profits: " << dp[n][m] << endl;
}
int main()
{
freopen("input.txt", "r", stdin);
cin >> n >> m;
// 利润表
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; ++j) {
cin >> G[i][j];
}
}
solve();
return 0;
}
注:复试题