Dan有一个相当成功的开放问题继续浏览他的博客。
如果我给你一些立体糖果,它们最少需要多少包装?
在他的帖子的评论中,出现了很多解决问题的好方法。我自己也试过几次。从列出前几个条目开始,并尝试手动查找解决方案。1颗糖果,(1,1,1)立方体:表面积6。可以用(3,1,1)做3个糖果。表面积14。但像20岁这样的人有几个选择。(10,2,1)的表面积为64,但(5,2,2)的表体积为48。
从那篇论文中,我能够生成最小表面积序列的开头:6、10、14、16、22、22、30、24……然后我在OEIS上搜索,结果是https://oeis.org/A075777.
然后,我决定尝试用基本的python对该算法进行编码,这是一个很好的练习,所以这里是我的脚本:
(谨慎:此脚本生成不准确的结果,它是不准确的OEIS算法的脚本。我改进后的脚本将在本帖中进一步介绍)
1 2 三 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
进口 数学 虽然 1==1: #输入 n个 = 输入(“多少糖果?n=”) n个 = 整数(n个) 第10节 = 整数(数学.地板(n个 ** (1 / 3))) 打印(“s1_0=”, 第10节) 第1页 = 第10节 虽然 n个 % 第1页 > 0: 第1页 = 第1页 - 1 打印(第1页) 打印(“第1面=”,第1页) 1报价 = 整数(n个/第1页) #糖果除以第一面的商 第2 _0页 = 整数(数学.地板(数学.平方英尺(n个/第1页))) 打印(“s2_0=”, 第2 _0页) s2秒 = 第2 _0页 虽然 1报价 % s2秒 > 0: s2秒 = s2秒 - 1 打印(s2秒) 打印(“第2面=”,s2秒) 第3节 = 整数(n个 / (第1页 * s2秒)) 打印(“第三面=”,第3节) 沙特阿拉伯 = 2*(第1页*s2秒 + 第1页*第3节 + s2秒*第3节) 打印(“{”,第1页,", ",s2秒,", ",第3节,“},表面积=”, 沙特阿拉伯) 打印(“\n====结束====\n”) |
这个算法与其他人在Dan的评论线程中使用的一些算法非常相似。但这就是它变得有趣的地方。除非我的代码中有错误(完全可能!),否则我认为我们已经破坏了这个算法。丹经常给一些此处为打破算法的数字事实上,其中一些破坏了OEIS上的算法:
使用OEIS上描述的算法,取n=1332:
立方根为~11.002
楼层是11,但既不是11也不是10除以n。
9除以n。s1=9
n/9=148
平方根(148)=~12.166
底数是12,但我们需要一次减去1,直到得到148:4的除数。
s2=4
那么s3=37
这就得到了1034的表面积。
然而,最小表面积由以下实体给出6*6*37. 表面积为960在这种情况下。
当n=68和n=74634时,算法也失效。
我们可以看到算法似乎遇到的问题是第一个除数同时使用了太多的素因子最大的立方根下n的除数。我正在通知OEIS(我需要一个帐户!),除非有人看到我的错误。
这里有很多好的数学实践!
更新:我改进了算法,使其循环通过立方根下的s1s,将n除以平方根下的s2s。这要慢得多,但应该是准确的。
1 2 三 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
定义 minS矩形棱镜(n个): 第10节 = 整数(数学.天花板(n个 ** (1 / 3))) 最小SA=-1 第1页 = 第10节 虽然 第1页>=1: 虽然 n个 % 第1页 > 0: 第1页 = 第1页 - 1 1分之一 = 整数(n个/第1页) 第2 _0页 = 整数(数学.天花板(数学.平方英尺(n个/第1页))) s2秒 = 第2 _0页 虽然 s2秒>=1: 虽然 1分之一 % s2秒 > 0: s2秒 = s2秒 - 1 第3节 = 整数(n个 / (第1页 * s2秒)) 沙特阿拉伯 = 2*(第1页*s2秒 + 第1页*第3节 + s2秒*第3节) 如果 最小SA==-1: 最小SA=沙特阿拉伯 其他的: 如果 沙特阿拉伯<最小SA: 最小SA=沙特阿拉伯 s2秒 = s2秒 - 1 第1页 = 第1页 - 1 返回 最小SA |
下面是一个文件,其中显示了最多5000个结果:minSA csv高达5000
这里有一个最多30000列,其中n、s1、s2、s3、minSA列:最小表面面积SF达30000