求子集算法

昨天上课,一同学说的一个题目,连说了好几个,一个都不会,呵呵,没事就研究了其中的一个求子集算法,很久没碰数论了,都快忘了什么是子集,所以在接下来的文字之前,还是先说说我对“子集”的理解吧:

一堆苹果,去任意个(0个或者全部)分成任意组,问一共有多少种分法?

不要问算法是怎么来的,你花1个多小时在纸上测试100多个“1234”之后估计就知道了,不是有人说过,成功=99%努力+1%运气,大概也就是这个意思了,不过,如果你要是演算了几百个1234还是总结不出你的算法的话,估计你就要注意那个公式后面的一句话了:1%运气 > 99%努力

 

如果掌握的子集的生成规律,基本上就得出了算法,而我的算法也正是源于发现了如下的规律:

(先不考虑空集的情况,那个太没技术含量了)

先看1的子集:(1)

再看2的子集:(1);(2);(1,2)

(3的情况我就不写了,上面这个足于说明规律了,然后有兴趣的自己推3去)

简单描述:

首先,要求2的子集,先要得到1的子集(代码中设为oldList)

接着,在oldList的基础上先加入当前数(也就是2了),得到了:(1);(2)

最后,当前数2与oldList进行一个**操作得到剩下的子集部分。

**操作描述如下:

2 ** (1)

2加在括号外面:(1)(2)

2加在括号里面:(1,2)

于是,就得到了2的子集:(1);(2);(1)(2);(1,2)

 

如果是:3 ** (1)(2)

结果就是:

3加在括号外面:(1)(2)(3)

3加在括号里面:(1)(2,3);(1,3)(2) - 也就是说每个集合都单独算一次

 

恩,有些难描述,由于明天还有复考,剩下的就是只能贴个代码给大家自己研究了,使用js脚本语言写的,大家直接复制粘贴保存为html文件打开即可。

Code
posted @ 2008-10-31 09:03  小黑  阅读(581)  评论(0)    收藏  举报