zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        }
    
        return 0;
    }
  • 相关阅读:
    工厂方法模式
    代理模式
    观察者模式
    策略模式
    单例模式
    简单工厂模式
    lintcode:等价二叉树
    lintcode:被围绕的区域
    lintcode:二叉树的所有路径
    lintcode:快乐数
  • 原文地址:https://www.cnblogs.com/fish7/p/4247943.html
Copyright © 2011-2022 走看看