杭电acm1028.整数拆分

来源:互联网 发布:泛微协同软件 编辑:程序博客网 时间:2024/06/07 00:08

题目大意:整数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;}


原创粉丝点击