现在的位置: 首页 > 综合 > 正文

杭电acm1028.整数拆分

2019年09月22日 ⁄ 综合 ⁄ 共 641字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.