zoj 1454 - Employment Planning

题目:一个老板,他知道自己每个月需要多少员工,雇佣新员工和解雇员工都需要支付费用;

           员工被雇佣,每个月即使不工作也会有工资,这个老板想在保证正常工作条件下的最小开支。

分析: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值