ACM程序设计之基本算法(枚举与递归初步).pptVIP

ACM程序设计之基本算法(枚举与递归初步).ppt

  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文档。上传文档
查看更多
ACM程序设计之基本算法(枚举与递归初步)

ACM 程序设计基础 ——基本算法 张先伟 常用基本算法 枚举法 递推法 递归和分治 动态规划法 贪心法 POJ 1017 Packets 题意 已知:有6*6 的大箱子和 1*1,2*2,3*3,4*4,5*5,6*6 的木块 问:给定各种木块的数目,求最少需要多少个大箱子来装? 例如: 输入:0 0 4 0 0 1 -〉 输出 2 输入:7 5 1 0 0 0 -〉 输出 1 Packets解题思想 6*6的木块每个占用一个箱子; 5*5的木块每个占用一个新箱子,余下11个1*1的空格; 4*4的木块每个占用一个新箱子,余下5个2*2的空格; 3*3的木块每4个占用新一个箱子,不足4个也占一个新箱子,分情况余下不同数目的空格; 2*2的木块先填空格,空格不足开新箱子,每9个占一个新箱子; 1*1的木块先填空格,空格不足开新箱子,每36个占一个新箱子。 Packets 构造法 6*6,5*5,4*4 ,3*3,2*2,1*1 个数 f e d c b a Z - 箱子数 1) z = f + e +d +(c+3)/4 4*4, 5*5, 6*6 单独开新的箱子 3*3 每 1-4 个占一个新箱子 Packets Packets Packets 2)y 表示能装2*2 的空位置 int u[4] = {0, 5, 3,1}; y= 5*d + u[c%4]; 3) x 表示能装1*1 的空位置 int t[4] = {0, 7, 6, 5} x = 11*e + t[c%4]; Packets Packets Packets Packets 4) 装 2*2 的块并计算剩余的1*1的位置 if(yb){ // 空位不够装2*2块 i=(b-y+8)/9; z += i; x+= 4*(9*i –(b-y)); } else x+= 4*(y-b); // 空位够装2*2块 Packets 5)根据1*1块重新计算z if(xa) z+=(a-x+35)/36; 6) 输出 z #include iostream.h int t[4] = { 0, 7, 6, 5 }, u[4] = { 0, 5, 3, 1 }; void main() { int a,b,c,d,e,f,i,x,y,z; for(;;) { cinabcdef; if(a==0 b==0 c==0 d==0 e==0 f==0) break; x = 11 * e + t[c % 4]; y = 5 * d + u[c % 4]; z = f + d + e + (c + 3) / 4; if(y b) { i = (b - y + 8) / 9; z += i; x += 4 * (9 * i - (b - y)); } else x += 4 * (y - b); if(x a) z += (a - x + 35) / 36; cout z endl; } } 枚举 一种解决问题的方法。例如:求小于N的最大素数 找不到一个数学公式,使得我们根据N就可以计算出这个素数 N-1是素数吗?N-2是素数吗?……N-K是素数的充分必要条件是:N-K不能被任何一个大于1、小于N-K的素数整除。 判断N-K是否是素数的问题又成了求小于N-K的全部素数 解决方法: 2是素数,记为PRIM0 根据PRIM0、PRIM1、… 、PRIMk ,寻找比PRIMk大的最小素数PRIMk+1。如果PRIMk+1大于N,则PRIMk是我们需要找的素数,否则继续寻找 枚举的思想: 列出所有可能的情况,逐一检查是否是问题的解 关键: 可能的情况是什么 有序地枚举,不漏掉情况 尽早发现不是解的情况 例3:完美立方 (POJ1543) 问题描述: a3 = b3 + c3 + d3为完美立方等式。例如123 = 63 + 83 + 103 。编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a3 = b3 + c3 + d3,其中

文档评论(0)

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

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

1亿VIP精品文档

相关文档