2020/3/25

“人生亦有梦,安能行叹复坐愁…”

在第三讲动态规划里,有这样一个题:

    **复制书稿**

假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。
任务:将这M本书分给K个抄写员(K<=M) 每本书只能分配给一个抄写员进行抄写,而每个抄写员所分配到的书必须是连续顺序的。
复制工作是同时开始进行的,并且每个抄写员复制一页书的速度都是一样的。所以,复制完所有书稿所需时间取决于分配得到最多工作的那个抄写员的复制时间。
试找一个最优分配方案,使分配给每一个抄写员的页数的最大值尽可能小。
解题思路:有题意可知每个抄写员抄一页书的速度一样,而且复制完所有书稿所需要的时间取决于分配得到最多工作的那个抄写员的复制时间,这样就按照怎样分配书本来使得最大值最小,唯一的限制条件就是书本的分配必须是连号的,M/K向上取整为n,然后计算sum[i](为n项和)的值,然后找出最小的一个。

#include<bits/sdtc++.h>
using namespace std;
const int MAXN = 510;
int sum[MAXN],path[MAXN],dp[MAXN][MAXN];
int main()
{

int main(){    
int m,k,i,j,v,ca,p,t;  
  scanf("%d",&ca);    
  while(ca--){       
    scanf("%d %d",&m,&k);       
      for(sum[0]=0,i=1;i<=m;i++){
              scanf("%d",&p);  
           sum[i]=sum[i-1]+p;    
           }      
            memset(dp,-1,sizeof(dp));    
     for(dp[0][0]=0,i=1;i<=m;i++)     
             for(j=1;j<=i && j<=k;j++){      
             if(j==1) dp[i][j]=sum[i];            
            else     for(v=j-1;v<=i-1;v++){
            t=max(dp[v][j-1],sum[i]-sum[v]);        
                  if(dp[i][j]==-1 || t<=dp[i][j]) 
                  dp[i][j]=t;           }      
                }         
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值