#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<vector>
#include<string.h>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#define ll long long
#define INF 0x7fffffff
#define MAX 0x3f3f3f3f
#define maxn 100005
#define ull unsigned long long
using namespace std;
int f[15],dp[15][20005];//月份 人数
int main()
{
int n,h,s,fi,i,j,k,p,ans;
while(~scanf("%d",&n)&&n)
{
scanf("%d%d%d",&h,&s,&fi);
p=0;ans=MAX;//初始化
for(i=1;i<=n;i++)
{
scanf("%d",&f[i]);
if(p<f[i])p=f[i];
}
if(p==0)
{
printf("0\n");
continue;
}
for(i=f[1];i<=p;i++)//从1月需要的人数到最多需要的人数
dp[1][i]=h*i+s*i;//枚举人数的所有情况 初始化
for(i=2;i<=n;i++)//从2月开始到尾月
{
for(j=f[i];j<=p;j++)//从对应月到最多需要的人数
{
dp[i][j]=MAX;//初始化!!!!!!!!!
for(k=f[i-1];k<=p;k++)//从对应月的上一个月到最多需要的人数
{//分情况
if(k<=j)//k->j还需要雇人
dp[i][j]=min(dp[i-1][k]+(j-k)*h+j*s,dp[i][j]);
else//j->p需要解雇人
dp[i][j]=min(dp[i-1][k]+(k-j)*fi+j*s,dp[i][j]);
}//dp本身代表花销,勿忘需要加上工资
}
}
for(i=f[n];i<=p;i++)//找到所有支路的最小值
ans=min(ans,dp[n][i]);
printf("%d\n",ans);
}
return 0;
}
11-27
1546
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交