|
发表于 2013-9-3 09:49:17
|
显示全部楼层
这个问题我没问清楚。
求解子集元素的总和,我也搞过。我当时的想法是这样的:
以 N=100 为例,其全体约数的集合为{1, 2, 4, 5, 10, 20, 25, 50},则
1+2+4+5+10+20+25=67<100
1+2+4+5+10+20+25+50=117>100
由此可以断定,只有从元素 50 开始的子集,比如{1, 2, 4, 50},才有可能满足要求。因此,前面的子集,比如{1, 2, 4}就直接跳过。
尽管跳过了一些搜索区间,但搜索速度还是非常缓慢。搜索 43 个元素构成的整个组合区间,我花了两周的时间(E3210,24小时不停机)。
我生成组合的算法是经典的“字典法”,即 101 的下一个组合是 110。我想可能是这个算法太低效了。
所以,我想问的是:
① 你的子集生成算法是什么?
② 你认为你整个算法中,瓶颈是在子集生成?128bits 求和?还是两者都有?
谢谢!
另外,我还想补充一个问题。
对于找约数,我有一种感觉:如果约数的平方小于原数,则可能存在比它大的“真约数”。
还是以 100 为例,原数N=100,约数n=5时,5^2=25<100;约数n=10时,10^2=100,而 10 可以分解成 2 和 5 两个约数,故 10 不是“真约数”,但 5 是“真约数”。
好了,剩下的约数我可以不用找了,直接用真约数去“凑”就可以了。比如,5^2=25也是一个100的约数。
不知道我这个猜想 成不成立? |
|