题目:一个老板,他知道自己每个月需要多少员工,雇佣新员工和解雇员工都需要支付费用;
员工被雇佣,每个月即使不工作也会有工资,这个老板想在保证正常工作条件下的最小开支。
分析:dp。典型多阶段决策;
阶段:月份;
状态:f(i,j)表示到第i个月份,雇佣 j 个人的最优解;
决策:雇佣,解雇,不变,这三种中的最优解 。
说明:(⊙_⊙)。(2011-9-25 17:53)
#include <stdio.h>
#include <stdlib.h>
#define INF 0xfffffff
int F[ 13 ][ 101 ];
int C[ 13 ];
int main()
{
int m,h,s,f,n;
int M = 0;
while ( scanf("%d",&m) && m ) {
scanf("%d%d%d",&h,&s,&f);
for ( int i = 1 ; i <= m ; ++ i )
scanf("%d",&C[ i ]);
for ( int i = 1 ; i <= m ; ++ i )
if ( M < C[ i ] ) M = C[ i ];
for ( int i = 0 ; i <= m ; ++ i )
for ( int j = 0 ; j <= M ; ++ j )
F[ i ][ j ] = INF;
F[ 0 ][ 0 ] = 0;
for ( int i = 1 ; i <= m ; ++ i ) {
for ( int j = 0 ; j <= M ; ++ j )
for ( int k = C[ i ] ; k <= M ; ++ k ) {
int cost = k*s;
if ( j <= k ) cost += (k-j)*h;
else cost += (j-k)*f;
if ( F[ i ][ k ] > F[ i-1 ][ j ] + cost )
F[ i ][ k ] = F[ i-1 ][ j ] + cost;
}
}
int min = INF;
for ( int i = C[ m ] ; i <= M ; ++ i )
if ( min > F[ m ][ i ] )
min = F[ m ][ i ] ;
printf("%d\n",min);
}
return 0;
}