题目大意:整数n可以用1,2 ,3 ,4.....,n相加表示;原题:点击打开链接
题目解析:相当于把n个无区别的球放到n个无标志的盒子,盒子允许空,也允许放多于一个球
错误分析:1.j这里j就是(前面i个表达式累乘的表达式)里第j个变量,因此每次前i个表达式累乘求完后都把中间变量a2赋值给a1,
因此要把for循环放在i的for循环里;
2.a1数组的大小要大于120;
#include<stdio.h> #include<iostream> using namespace std; int a1[121],a2[121]; int main() { int i,j,k,n; while(scanf("%d",&n)!=EOF) {for(i=0;i<=n;i++) { a1[i]=1; a2[i]=0; } for(i=2;i<=n;++i) { //求第i个表达式(1+x^(k+i)+x^(k+2i)+x^(k+3i)+...) for(j=0;j<=n;++j)//j 从0到n遍历,这里j就是(前面i个表达式累乘的表达式)里第j个变量, for(k=0;k+j<=n;k+=i)// k表示的是第j个指数,所以k每次增i(因为第i个表达式的增量是i)。 { a2[j+k]+=a1[j]; } // 每次前i个表达式累乘求完后都把中间变量a2赋值给a1 for(j=0;j<=n;++j) { a1[j]=a2[j]; a2[j]=0; } } printf("%d\n",a1[n]); } return 0; }