//DP[i][j]表示第i月用j个工人的最小花费
//枚举+DP,k为上月使用的工人数
//if(j <= k)
// cost = (hiring*(j-k)) + s*j + DP[i-1][k];
//else
// cost = (firing*(k-j)) + s*j + DP[i-1][k];
//枚举j和k,将cost的最小值填入DP[i][j];
//结果为DP[month][....]的最小值
#include <iostream>
#include <cstring>
using namespace std;
int month;
int hiring,firing,salary;
int worker[13];
int DP[13][1000];
int main()
{
while(cin>>month,month != 0)
{
cin>>hiring>>salary>>firing;
int maxj = 0;
for(int i = 1; i <= month; i++)
{
cin>>worker[i];
if(maxj < worker[i])
{
maxj = worker[i];
}
}
for(int i = worker[1]; i <= maxj; i++)
{
DP[1][i] = (hiring*i + salary*i);
}
int cost = 0;
for(int i = 2; i <= month; i++)
{
for(int j = worker[i]; j <= maxj; j++)
{
int mins = 999999999;
for(int k = worker[i-1]; k <= maxj; k++)
{
if(j >= k)
{
cost = (hiring*(j-k)) + salary*j + DP[i-1][k];
}
else
{
cost = (firing*(k-j)) + salary*j + DP[i-1][k];
}
if(cost < mins )
{
mins = cost;
}
}
DP[i][j] = mins;
}
}
int min = 999999999;
for(int i = worker[month]; i <= maxj; i++)
{
if(min > DP[month][i])
{
min = DP[month][i];
}
}
cout<<min<<endl;
}
return 0;
}
hdu 1158 枚举+DP
最新推荐文章于 2021-07-16 09:14:30 发布
本文介绍了一个使用动态规划解决员工调度问题的算法实现。通过枚举当前月和上个月的工人数量,计算不同情况下的最小成本,并最终求得整个月份内的最低总成本。

638

被折叠的 条评论
为什么被折叠?



