首页 > 代码库 > hdu 1158 Employment Planning(DP)

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

 

hdu 1158 Employment Planning(DP)