hdu 1158 Employment Planning(DP)

题意:

有一个工程需要N个月才能完成。(n<=12)

给出雇佣一个工人的费用、每个工人每个月的工资、解雇一个工人的费用。

然后给出N个月所需的最少工人人数。

问完成这个项目最少需要花多少钱。

 

思路:

将(i,num):【第i个月拥有num个工人 】看成一个状态。那么就想到用DP。

看代码

 

代码:

struct node{
    int minNum, maxNum;
}
month[15];


int n;
int hire,salary,fire;
int dp[15][505];


int main(){

    int n;
    while(scanf("%d",&n),n){
        scanf("%d%d%d",&hire,&salary,&fire);
        int maxs=-1;
        rep(i,1,n){
            scanf("%d",&month[i].minNum);
            maxs=max( maxs,month[i].minNum);
        }
        rep(i,1,n){
            month[i].maxNum=maxs;
        }

        mem(dp,inf);

        rep(i,month[1].minNum,month[1].maxNum){
            dp[1][i]=i*(hire+salary);
        }
        rep(i,2,n){
            rep(j,month[i].minNum,month[i].maxNum){ //这个月招人数
                rep(k,month[i-1].minNum,month[i-1].maxNum){ //上个月招人数
                    int dd;
                    if(j>k){
                        dd=(j-k)*hire;
                    }else{
                        dd=(k-j)*fire;
                    }
                    dp[i][j]=min( dp[i][j],dp[i-1][k]+salary*j+dd );
                }
            }
        }
        int ans=inf;
        rep(i,month[n].minNum,month[n].maxNum){
            ans=min( ans,dp[n][i] );
        }
        printf("%d\n",ans);
    }

    return 0;
}

 

posted @ 2015-01-25 11:11  fish7  阅读(88)  评论(0编辑  收藏  举报