プロジェクトマネージャは、毎月必要な労働者の数を決定したいと考えています。彼は毎月必要な労働者の最小数を知っています。彼が労働者を雇うか解雇するとき、いくらかの追加費用があります。労働者が雇われると、彼は働いていなくても給与を受け取ります。マネージャーは、労働者の雇用、労働者の解雇、労働者の給与のコストを知っています。次に、マネージャーはこのような問題に直面します。プロジェクトの総コストを最小限に抑えるために、毎月何人の労働者を雇うか解雇するかです。
入力
入力には複数のデータセットが含まれる場合があります。各データセットには3つの行が含まれます。最初の行には、使用が予定されているプロジェクトの月数が12以下です。2番目の行には、労働者の雇用コスト、給与の額、ワーカーを解雇するためのコスト。3行目には、毎月必要なワーカーの最小数を表すいくつかの数値が含まれます。入力は、単一の「0」を含む行で終了します。
出力
出力には1行が含まれます。最小合計コストプロジェクトの
サンプル入力
3
4 5 6
10 9 11
0
サンプル出力
199
トピック:合計nか月あり、毎月必要な最小従業員数を知っています。従業員を雇い、従業員を解雇し、従業員の月給をいくら支払うか知っています。最小限のお金が費やされるように毎月従業員の数を調整する方法を尋ねます。お金を出力します。
アイデア:dp [i] [j]を、jか月目にi人の従業員を雇用するコストの最小値とする 前月の入居者数からの転勤となります。前月に採用した人数に基づいて、今月のj人の最小採用コストを計算します。
コードは次のとおりです。
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxx=1e4+100;
int dp[maxx][15];
int wnum[15];
int n,hc,wc,fc;
int main()
{
while(~scanf("%d",&n),n)
{
scanf("%d%d%d",&hc,&wc,&fc);
int _max=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&wnum[i]);
_max=max(_max,wnum[i]);
}
for(int i=wnum[1];i<=_max;i++) dp[i][1]=i*(hc+wc);//第一个月的初始化一下。
for(int i=2;i<=n;i++)
{
for(int j=wnum[i];j<=_max;j++)//枚举这个月可能雇佣的人数
{
int _min=inf;
for(int k=wnum[i-1];k<=_max;k++)//枚举上一个月雇佣的人数
{
int sum=0;
if(k>=j) sum=dp[k][i-1]+(k-j)*fc+j*wc;
else sum=dp[k][i-1]+j*wc+(j-k)*hc;//根据不同的情况计算雇佣j个人所需要的花费
_min=min(_min,sum);//取最小值
}
dp[j][i]=_min;
}
}
int _min=inf;
for(int i=wnum[n];i<=_max;i++) _min=min(_min,dp[i][n]);
printf("%d\n",_min);
}
return 0;
}
頑張って(o)/〜