(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;
}

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