找回密码
 欢迎注册
查看: 9943|回复: 4

[讨论] 用水晶来搭建一座双塔

[复制链接]
发表于 2010-4-16 12:28:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
问题描述:
2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔。
  Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建。但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少。所以他来请你帮忙。
  给定水晶的数量N(1≤N≤100)和每块水晶的高度Hi(N块水晶高度的总和不超过2000),你的任务是判断Mr. F能否用这些水晶搭建成一座双塔(两座塔有同样的高度),如果能,则输出所能搭建的双塔的最大高度,否则输出“Impossible”。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-4-17 07:04:38 | 显示全部楼层
和本站的 高德纳书中一道很普通的题目类似,只是问题规模更大,且没有有效的优化手段。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-4-18 10:05:04 | 显示全部楼层
tower_mycode.jpg
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-4-18 10:06:06 | 显示全部楼层
这个算法效率如何?

开一个二维数组f[ i ][ j ]来保存加入第i个数后,在这堆已加入的数里取出其中两组,差为j的这两组数的最大和为 f [i ][ j ]。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-4-18 10:50:11 | 显示全部楼层
看来$2#$下的结论有点武断,骗了不少人(包括Fans),以为真的没有好方法。

其实就是状态数为$1001$*$1001$的动态规划问题。

其中第一个$1001$表示第一座塔的高度有$0$、$1$、$2$、$...$、$1000$共$1001$种可能。

第二个$1001$表示第二座塔的高度也有$0$、$1$、$2$、$...$、$1000$共$1001$种可能。

初始时状态$[0,0]$有效,其余状态无效。

如果状态$[i,j]$有效,那么考虑下一座高度为$h$的塔,可以到达状态$[i+h,j]$和$[i,j+h]$。

于是把状态$[i+h,j]$和$[i,j+h]$设置为有效,并且原始状态$[i,j]$仍然有效。

把$N$座塔全考虑完后,依次检查状态$[1000,1000]$、$[999,999]$、$[998,998]$、……、$[1,1]$是否有效,即可找到双塔的最大高度。

最坏情况的运算次数:$1001$*$1001$*$100$=$10^8$

是可以在$1$秒之内出结果的。

如果规模再大一点,就不能保证在$1$秒之内出结果。

$3#$的方法更巧妙。

可以解决更大规模的问题。

比如$1000$块水晶,高度总和不超过$100000$。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-1 21:41 , Processed in 0.050356 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表