问题描述
资源分配问题是将数量一定的一种或若干种资源(原材料、资金、设备或劳动力等),合理地分配给若干使用者,使总收益最大。
例如,某公司有3个商店A、B、C,拟将新招聘的5名员工分配给这3个商店,各商店得到新员工后,每年的赢利情况如下表所示,求分配给各商店各多少员工才能使公司的赢利最大?
问题求解
采用动态规划求解该问题。设置3个商店A、B、C的编号分别为1~3。
这里总员工数为n=5,商店个数m=3,假设从商店3开始决策起。
设置二维动态规划数组为dp,其中dp[i][s]表示考虑商店i~商店m并分配s个人后的最优赢利。
另外设置二维数组pnum,其中pnum[i][s]表示求出dp[i][s]时对应商店i的分配人数。
对应的状态转移方程如下:
代码
//问题表示
int m = 3, n = 5; //商店数为m,总人数为n
int v[MAXN][MAXN] = { {0,0,0,0,0,0},{0,3,7,9,12,13},
{0,5,10,11,11,11},{0,4,6,11,12,12} }; //不计v[0]行
//求解结果表示
int dp[MAXN][MAXN];
int pnum[MAXN][MAXN];
void Plan()
{
int maxf, maxj;
for (int j = 0; j <= n; j++)
dp[m + 1][j] = 0;
for (int i = m; i >= 1; i--)
{
for (int s = 1; s <= n; s++)
{
maxf = 0;
maxj = 0;
for (int j = 0; j <= s; j++)
{
if ((v[i][j] + dp[i + 1][s - j] >= maxf))
{
maxf = v[i][j] + dp[i + 1][s - j];
maxj = j;
}
}
dp[i][s] = maxf;
pnum[i][s] = maxj;
}
}
}