理论上说是用了母函数理论。不过我喜欢通俗的解释。
对于1~n每个数。我们从1开始,1可以组成1~n任何一个数,
所以ans[i] = 1;(1<=i<=n)
然后接着是2,用一个2我们以添加到刚才的ans中,即凡是满足ans[i+2]的数值的记录都要加1。(1<=i+2<=n)
所以所用用到一个2的数值的拆分方式都加上1,即满足ans[i+2*2]的数值都要加1。
然后再用两个2……三个2……
一个3……两个3……三个3……
……
代码如下:
#include <cstdio>
int a[121], b[121];
int main ()
{
int n;
while(scanf("%d",&n)==1)
{
for(int i = 0; i <= n; i++) {a[i] = 1; b[i] = 0;}
for(int i = 2; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
for(int k = 0; k+j<=n; k+=i)
{
b[k+j]+=a[j];
}
}
for(int j = 0; j <= n; j++)
{
a[j] = b[j];
b[j] = 0;
}
}
printf("%d\n",a[n]);
}
return 0;
}