Planificación de empleo HDU-1158 (Planificación dinámica)

Un gerente de proyecto quiere determinar la cantidad de trabajadores necesarios cada mes. Él conoce la cantidad mínima de trabajadores necesarios cada mes. Cuando él contrata o despide a un trabajador, habrá algún costo adicional. Una vez que se contrata a un trabajador, obtendrá el salario incluso si no está trabajando. El gerente conoce los costos de contratar a un trabajador, despedir a un trabajador y el salario de un trabajador. Luego, el gerente se enfrentará a ese problema: cuántos trabajadores contratará o despedirá cada mes para mantener el costo total más bajo del proyecto.
Entrada
La entrada puede contener varios conjuntos de datos. Cada conjunto de datos contiene tres líneas. La primera línea contiene los meses del proyecto planeado para usar que no es más de 12. La segunda línea contiene el costo de contratar a un trabajador, la cantidad del salario, el costo de despedir a un trabajador. La tercera línea contiene varios números, que representan la cantidad mínima de trabajadores necesarios cada mes. La entrada termina con una línea que contiene un solo '0'.
Salida
La salida contiene una línea. El costo total mínimo del proyecto
Muestra de entrada
3
4 5 6
10 9 11
0
Muestra de salida
199
Tema: Hay n meses en total, conociendo el número mínimo de empleados requeridos cada mes. Sepa cuánto dinero contratar a un empleado, despedir a un empleado, el salario mensual de un empleado. Pregunte cómo organizar la cantidad de empleados cada mes para gastar la menor cantidad de dinero. Salida de dinero.
Idea: Dejamos que dp [i] [j] represente el valor mínimo del costo de contratar i empleados en el mes j. Debe transferirse de la cantidad de personas contratadas en el mes anterior. Según el número de personas contratadas en el mes anterior, calculamos el costo mínimo de contratar a j individuos este mes.
El código es el siguiente:

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

Vamos duro, ( o ) / ~

Publicado 652 artículos originales · ganó 101 · vistas 50,000+

Supongo que te gusta

Origin blog.csdn.net/starlet_kiss/article/details/105448958
Recomendado
Clasificación