[PTA]
6-1 求解资源分配问题(动态规划法)
某公司有3个商店A、B、C,拟将新招聘的5名员工分配给这3个商店,各商店得到新员工后,每年的赢利情况如下表所示,求分配给各商店各多少员工才能使公司的赢利最大。
函数接口定义:
void Plan(); //求最优方案dp
裁判测试程序样例:
#include <stdio.h>
#include <iostream>
#define MAXM 10 //最多商店数
#define MAXN 10 //最多投入的人数
using namespace std;
int m,n; //商店数为m,总人数为n
int v[MAXM][MAXN]={0};
int dp[MAXM][MAXN];
int pnum[MAXM][MAXN];
void Plan() ; //求最优方案dp
void dispPlan() //输出最优分配方案
{
int k,r,s;
s=pnum[m][n];
r=n-s; //r为余下的人数
for (k=m;k>=1;k--) //从m到1
{
printf("%d %d\n",k,s);
s=pnum[k-1][r]; //求下一个阶段分配的人数
r=r-s; //余下人数递减
}
printf("%d",dp[m][n]);
}
int main()
{
int i,j;
cin>>m>>n;
for(i=0;i<=m;i++)
for(j=0;j<=n;j++)
cin>>v[i][j];
Plan();
dispPlan();
return 0;
}
/* 请在这里填写答案 */
输入格式:
第一行输入商店数m及员工人数n,再依次输入m+1行,每行为n+1个数,每个数(i,j)表示i商店分配j人赢利值0≤i≤m,0≤j≤n。
输出格式:
输出前m行每行两个数,分别表示商店编号及分配人数,最后一行表示公司最大赢利。
输入样例1:
3 5
0 0 0 0 0 0
0 3 7 9 12 13
0 5 10 11 11 11
0 4 6 11 12 12
输出样例1:
3 3
2 2
1 0
21
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解题思路:
考察动态规划,要掌握bottom to up的思想。
先算出先算出i、j较小的最大dp[i][j]的值,是在哪个p的时候取的,并保存到pnum[i][j]=p;
再逐渐增大i、j,并直接运用较小ij的dp[i][j]的值进行运算。
代码如下:
void Plan(){ //求最优方案dp
/**********初始化**********/
dp[m][n]=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
pnum[i][j]=0;
dp[m][n]=0;
}
}
/*********状态转移方程*********/
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
for(int p=0;p<=j;p++){
if(v[i][p]+dp[i-1][j-p]>=dp[i][j]){
//bottom to up得思想,先算出ij较小的最大dp[i][j]值是在哪个p的时候取的;
//再逐渐增大ij,并直接运用较小ij的dp[i][j]的值进行运算。
dp[i][j]=v[i][p]+dp[i-1][j-p];
pnum[i][j]=p;
}
}
}
}
}
测试用例:
运行结果:
文章来源:https://www.toymoban.com/news/detail-523702.html
编译器输出:
文章来源地址https://www.toymoban.com/news/detail-523702.html
到了这里,关于6-1 求解资源分配问题(动态规划法)[PTA]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!