最近遇到这样的一道题,用到了递归,采用两种办法实现,第一种超时,第二种满足要求。算法小白也算是递归有了一个初探。题目如下:
一个正整数可以表示为多个正整数相加的表达式,表达式中的各个正整数要求都是2的幂。例如给定正整数7,它有下列六个符合要求的表达式:
1)1+1+1+1+1+1+1
2)1+1+1+1+1+2
3)1+1+1+2+2
4)1+1+1+4
5)1+2+2+2
6)1+2+4
因此,正整数7符合条件的表达式个数是6. 编写一个程序,对于给定的正整数N(1 <= N <= 1,000),输出符合条件的表达式个数。要求:时间复杂度不高于O(N)。
起初没有思路,参考http://blog.csdn.net/zhang20072844/article/details/17033931 用C写了两种方法。
一、递推公式
我们可以先分析如下几个例子:
1的分解方法 有1种
1
2的分解方法 有2种
1 +1
2
3的分解方法 有2种
1+1+1
1+2
4的分解方法 有4种
1+1+1+1
1+1+2
2+2
4
5的分解方法有 4种
1+1+1+1+1
1+1+1+2
1+2+2