《金明的预算方案》三种解法.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《金明的预算方案》三种解法

《金明的预算方案》的三种不同解法 湖北省襄樊市第五中学 杨兵 《金明的预算方案》是NOIP2006提高组的第二题。对于这道题,在此提供两种不同的解法与大家共同探讨。 一、转化为01背包问题 考虑到每个主件最多只有两个附件,因此我们可以通过转化,把原问题转化为01背包问题来解决,在用01背包之前我们需要对输入数据进行处理,把每一种物品归类,即:把每一个主件和它的附件看作一类物品。处理好之后,我们就可以使用01背包算法了。在取某件物品时,我们只需要从以下四种方案中取最大的那种方案:只取主件、取主件+附件1、取主件+附件2、既主件+附件1+附件2。很容易得到如下状态转移方程: f[i,j]=max{f[i-1,j], f[i-1,j-a[i,0]]+a[i,0]*b[i,0], f[i-1,j-a[i,0]-a[i,1]]+a[i,0]*b[i,0]+a[i,1]*b[i,1], f[i-1,j-a[i,0]-a[i,2]]+a[i,0]*b[i,0]+a[i,2]*b[i,2], f[i-1,j-a[i,0]-a[i,1]-a[i,2]]+a[i,0]*b[i,0]+a[i,1]*b[i,1]+a[i,2]*b[i,2]} 其中,f[i,j]表示用j元钱,买前i类物品,所得的最大值,a[i,0]表示第i类物品主件的价格,a[i,1]表示第i类物品第1个附件的价格,a[i,2]表示第i类物品第2个附件的价格,b[i,0],b[i,1],b[i,2]分别表示主件、第1个附件和第2个附件的重要度。f[i-1,j]表示把j元钱全部投入前i-1类物品所得的最大值,即不取第i类物品这一方案,f[i-1,j-a[i,0]]+a[i,0]*b[i,0]表示只取第i类物品的主件这一方案,f[i-1,j-a[i,0]-a[i,1]]+a[i,0]*b[i,0]+a[i,1]*b[i,1],表示取第i类物品的主件和第1个附件这一方案,f[i-1,j-a[i,0]-a[i,2]]+a[i,0]*b[i,0]+a[i,2]*b[i,2],表示取第i类物品的主件和第2个附件这一方案,f[i-1,j-a[i,0]-a[i,1]-a[i,2]]+a[i,0]*b[i,0]+a[i,1]*b[i,1]+a[i,2]*b[i,2],则表示取第i类物品的主件和两个附件这一方案。 参考代码如下: program budget; var a:array[1..60,0..3] of integer;//a数组用来存放每一类物品,a[i,3]用来保存每类物品主件的编号 b:array[1..60,0..2] of integer; f:array[0..60,0..3200] of integer; n,m,i,s,v,p,q,j:integer; begin fillchar(a,sizeof(a),0); fillchar(b,sizeof(b),0); assign(input,budget.in); assign(output,budget.out); reset(input); rewrite(output); readln(n,m); n:=n div 10; s:=0; for i:=1 to m do begin readln(v,p,q);//读入数据 v:=v div 10;//优化,因为每个物品的价格是10的整数倍 if q=0 then begin//主件 inc(s); a[s,0]:=v; a[s,3]:=i; b[s,0]:=p; end else begin//是附件 for j:=1 to s do//此循环用来查找该附件的主件,找到后就退出循环 if a[j,3]=q then break; if a[j,1]=0 then begin a[j,1]:=v;b[j,1]:=p; end else begin a[j,2]:=v;b[j,2]:=p; end; end; end; fillchar(f,sizeof(f),0);

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档