求正整数n所有可能的和式的组合

来源:互联网 发布:家装平面设计软件 编辑:程序博客网 时间:2024/05/16 14:29

问题背景:求正整数n所有可能的和式的组合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2)


对于这个题目有两种理解了:


一> 如果将1+1+2和2+1+1当成不同的序列的话,这个问题会相对容易些。


拿n=4这个例子,首先最长的组合肯定是4=1+1+1+1,那么最短的组合是4=4,到最后可能会将4=4这种情况排除掉,所以所有组合的长度一定为1,2,3,4。


下面我们从长度为4即=1+1+1+1这个组合来生成长度为3的序列,那么即是从1,1,1,1这4个1中选择两个+号位置,并将两个+号位置之前的所有1的和作为一个加法项,即组合会有1,1+1+1 , 1+1,1+1和1+1+1,1即分别为2+1+1,1+2+1和1+1+2三种情况(采用插杆法)。长度为2的序列同理即在3个位置上选择1位置填上+号。
那么上面的计算可以得到一个组合数为C(3,0) + C(3,1) + C(3,2) + C(3,3) = 2^3个组合。如果4=4不算,则组合序列有2^3 - 1个,那么对于n则有的个数为2^(n-1) - 1个。


二> 将如果将1+1+2和2+1+1当成相同的序列的话会有点tricky,不过可以使用下面的方法来解决


假设现在得到的一个序列X的长度为N,那么我们可以从这个序列来拓展出长度N-1的序列。


首先统计X中含有几个不同的元素如1+1+2含有2个不同的元素1和2,将任意两个不同的元素相加生成一个新的元素p,用p来替换这个新的元素,这样1+1+2可以拓展出1+3这个序列。


再者,如果某一个元素出现我次数不少于2次,那么就将这个元素的2倍作为一个新的元素来替换掉两个元素,这样1+1+2可以生成2+2,因为1出现了再次。


注意从N长度生成N-1长度时可能需要进行排除重复的长度为N-1的序列,这个可以用一个map或者 hash_table来排除。