ZGS-动规练习题【信息技术】.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第1题 机器分配 (文件名:jqfp.pas/exe) 【问题描述】 M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M =15,N =10。分配原则:每个公司有权获得任意数目的设备,但总台数不得超过总设备数M。 【输入】.in 输入文件第一行是两个数,第一个数是设备台数M,第二个数是分公司数N。第二行开始是一个M*N的矩阵,分别表示机器台数分配给不同公司的不同盈利。 【输出】.out 输出文件第一行是一个数,即最大盈利值; 第二行开始共N行,每行2个数,第一个数是公司编号(按升序),第二个表示该公司应该分配的机器数目。 公司编号 机器台数 盈利 1 2 3 0 0 0 0 1 3 5 4 2 7 11 6 3 9 11 11 4 12 11 12 5 13 11 12 【样例输入】.in 5 3 0 0 0 0 1 3 5 4 2 7 11 6 3 9 11 11 4 12 11 12 5 13 11 12 【样例输出】.out 22 1 0 2 2 3 3 (机器数量分配有可能不同,但满足最大盈利,所以算正确) 【分析】 用机器数来做状态,数组F[I,J]表示前I个公司分配J台机器的最大盈利。则状态转移方程为: F[I,J]=Max{F[I-1,K] + Value[I,J-K]} (1 =I =N,1 =J =M,0 =K =J ) 初始值: F(0,0)=0 时间复杂度O(N*M2) 算法描述: S1:读入数据 S2:动态规划求解: for i:=1 to n do {阶段,给前i个公司分配机器} for j:=0 to m do {状态,分配给这i个公司的机器台数} for k:=0 to j do {决策,给前(i-1)个公司分配k台机器, 并给i号公司分配(j-k)台机器} if b[i-1,k] + a[i,j-k] b[i,j] then b[i,j]:= b[i-1,k] + a[i,j-k]; {当前的方案更优 then 更新 b[i,j]的值} S3:倒推求出每步的选择方法并输出最有方案。 【参考程序】 PROGRAM jqfp; const fi=jqfp.in; fo=jqfp.out; var M,N:byte; mem:array[0..10,0..15]of integer; knl:array[0..10,0..15]of longint; rcv:array[0..10,0..15,1..15]of integer; PROCEDURE Init; var i,j:byte; begin fillchar(mem,sizeof(mem),0); fillchar(knl,sizeof(knl),0); fillchar(rcv,sizeof(rcv),0); assign(input,fi); reset(input); readln(M,N); for i:=0 to M do begin read(j); for j:=1 to N do read(mem[j,i]); end; close(input); end; PROCEDURE Kernel; var i,j,k,l:byte; begin for i:=1 to N do for j:=0 to M do for k:=0 to j do if knl[i-1,k]+mem[i,j-k] knl[i,j] then begin knl[i,j]:=knl[i-1,k]+mem[i,j-k]; for l:=1 to i-1 do rcv[i,j,l]:=rcv[i-1,k,l]; rcv[i,j,i]:=j-k; end; end; PROCEDURE Print; var i:byte; begin assign(ou

文档评论(0)

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档