首页 > 代码库 > hdu 1158 dp
hdu 1158 dp
1 /* 2 题目大意:给n个月工作需要的人数,雇佣一个需要花hire 3 每个月的薪水是salary,解雇一个需要fire 4 求完成所有工作的最小费用 5 dp(i,j)表示第i个月雇佣j员工的最小费用 6 */ 7 #include <iostream> 8 #include <cstdio> 9 #include <cstring>10 using namespace std;11 12 const int maxn=15;13 const int INF=1<<30;14 int dp[maxn][300],num[maxn];15 inline int max(int a,int b){return a>b?a:b;}16 inline int min(int a,int b){return a<b?a:b;}17 int main()18 {19 int n,hire,salary,fire,i,j,k,Max;20 while(scanf("%d",&n),n)21 {22 scanf("%d%d%d",&hire,&salary,&fire);23 Max=0;24 for(i=1;i<=n;i++)25 {26 scanf("%d",num+i);27 Max=max(num[i],Max);28 }29 for(i=0;i<=Max;i++)30 dp[1][i]=(hire+salary)*i;31 for(i=2;i<=n;i++)32 {33 for(j=num[i];j<=Max;j++)34 {35 int temp=INF;36 for(k=num[i-1];k<=Max;k++)37 if(k<j)38 temp=min(temp,dp[i-1][k]+hire*(j-k)+salary*j);39 else40 temp=min(temp,dp[i-1][k]+fire*(k-j)+salary*j);41 dp[i][j]=temp;42 }43 }44 int ans=INF;45 for(i=num[n];i<=Max;i++)46 ans=min(ans,dp[n][i]);47 printf("%d\n",ans);48 }49 return 0;50 }
hdu 1158 dp
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。