zoukankan      html  css  js  c++  java
  • 母函数 hut1028

    描述:输入N,求解有几种和式;

    #include"iostream"
    using namespace  std;
    int c1[130],c2[130];
    int main()
    {
         int N;
         int i,j,k;
          while(scanf("%d",&N)!=EOF)
          {
              for(i=0;i<=N;++i)
              {
                 c1[i]=1;
                 c2[i]-0;                
              }
              for(i=2;i<=N;++i)
              {
                  for(j=0;j<=N;++j)
                     for(k=0;k+j<=N;k+=i)
                         c2[j+k]+=c1[j];                                        
                   for(j=0;j<=N;++j)
                   {
                       c1[j]=c2[j];
                       c2[j]=0;    
                   }
              }
              printf("%d\n",c1[N]);
          }  
          return 0;
    }
    或者是:定义一个常数量 _max值不改变

    #include"iostream"
    using namespace std;
    const  int _max=130;
    int num1[_max],num2[_max];
    int main()
    {
       int N,P;
       int i,j,k;
       while(cin>>N)
       {
           for(int i=0;i<=N;++i)
           {
              num1[i]=1;
              num2[i]=0;       
           }
           for(i=2;i<=N;++i)
           {
              for(j=0;j<=N;++j)
              {
                  for(k=0;j+k<=N;k+=i)
                    num2[j+k]+=num1[j];                
              }                
              for(j=0;j<=N;++j)
              {
                 num1[j]=num2[j];
                 num2[j]=0;                
              }
           }            
          cout<<num1[N]<<endl;
       }
        return 0;  
    }

    用memset初始化就会出现错误,太气人了!(可能会超出范围)以下的程序就是错误的:

    #include"iostream"
    using namespace std;
    const  int _max=200;
    int num1[_max],num2[_max];
    int main()
    {
       int N,P;
       int i,j,k;
       while(scanf("%d",N)!=EOF)
       {
           memset(num1,1,sizeof(num1));
           memset(num2,0,sizeof(num2));//越界;
           for(i=2;i<=N;++i)
           {
              for(j=0;j<=N;++j)
              {
                  for(k=0;j+k<=N;k+=i)
                    num2[j+k]+=num1[j];                
              }                
              for(j=0;j<=N;++j)
              {
                 num1[j]=num2[j];
                 num2[j]=0;                
              }
           }            
           printf("%d\n",num1[N]);
       }
        return 0;  
    }

  • 相关阅读:
    【BZOJ 2820】 YY的GCD (莫比乌斯+分块)
    【BZOJ 2005】[Noi2010]能量采集 (容斥原理| 欧拉筛+ 分块)
    【HDU 4898】 The Revenge of the Princess’ Knight (后缀数组+二分+贪心+...)
    【BZOJ 3473】 字符串 (后缀数组+RMQ+二分 | 广义SAM)
    【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)
    【GDOI2014 DAY2】Beyond (扩展KMP)
    【转】【最大子矩阵问题】【悬线法】 学习笔记
    【HDU4333】Revolving Digits(扩展KMP+KMP)
    【转】各种字符串算法大总结
    【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论
  • 原文地址:https://www.cnblogs.com/QQbai/p/2127505.html
Copyright © 2011-2022 走看看