(DP)HDU 1158 Employment Planning

#include<iostream>
#include<cstdio>
#define INF 10000000
using namespace std;
int worker[100005];
int dp[13][100005];
int main()
{
	int n;
	int i,j,k;
	while(scanf("%d",&n)!=EOF&&n)
	{
		int hire,salary,fire;     //招聘所需資金,工資,解僱所需資金
		scanf("%d%d%d",&hire,&salary,&fire);
		int max=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&worker[i]);
			max=max>worker[i]?max:worker[i];   //找出所需人數最多的人數
		}
		for(i=worker[1];i<=max;i++)
		{
			dp[1][i]=i*(hire+salary);        //初始化第一個月從最少人數到最多人數所需的工資
			
		}
		int min;
		for(i=2;i<=n;i++)                     //從第二個月開始
		{
			for(j=worker[i];j<=max;j++)        //從第i個月所需要最少人數到最多人數
			{
				min=INF;
				for(k=worker[i-1];k<=max;k++)   //上一個月所需最少人數到最多人數
				{
					/*如果前一個月的人數多於本月所需的人數,那麼就要開除多餘的人數*/
					if(k>j) min=min<dp[i-1][k]+(k-j)*fire+j*salary?min:dp[i-1][k]+(k-j)*fire+j*salary;   
					/*如果前一個月的人數少於本月所需的人數,那麼就要招進少於的人數*/
					else min=min<dp[i-1][k]+(j-k)*hire+j*salary?min:dp[i-1][k]+(j-k)*hire+j*salary;       
				}
				dp[i][j]=min;
			}
		}
		min=INF;
		/*遍歷第n個月從所需最少人數到最多的人數*/
		for(i=worker[n];i<=max;i++)
			min=min<dp[n][i]?min:dp[n][i];
		printf("%d\n",min);
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章