整数性质

来源:互联网 发布:遥感卫星影像数据购买 编辑:程序博客网 时间:2024/04/29 05:04

链接:http://115.159.40.116/problem_show.php?pid=5344;

  1. /*对于输入的 n,k; 
  2. 第一行: 将n划分成若干正整数之和的划分数。 
  3. 第二行: 将n划分成k个正整数之和的划分数。 
  4. 第三行: 将n划分成最大数不超过k的划分数。 
  5. 第四行: 将n划分成若干个 奇正整数之和的划分数。 
  6. 第五行: 将n划分成若干不同整数之和的划分数。 
  7. 第六行: 打印一个空行*/  
  8. #include<iostream>  
  9. #include <cstring>  
  10. #include<vector>  
  11. #include <cstdio>  
  12. using namespace std;  
  13. #define N 55+1  
  14. int dp[N][N];  
  15.   
  16. int main()  
  17. {  
  18.     //分为若干个正整数和  
  19.     //memset(dp,0,sizeof(dp));  
  20.     int n,k;  
  21.     int out[6];  
  22.     while(cin>>n>>k)  
  23.     {  
  24.         memset(dp,0,sizeof(dp));  
  25.         //任意个正整数和,则dp[i][j]表示i分解成最大不超过j的个数,  
  26.         //分为最大是j和最大不是j,则dp[i][j]=dp[i-j][j]+dp[i][j-1];  
  27.         dp[0][0]=1;  
  28.         for (int i=0;i<=n;i++)  
  29.         {  
  30.             for (int j=1;j<=n;j++)  
  31.             {  
  32.                 if(j<=i)  
  33.                 dp[i][j]=dp[i-j][j]+dp[i][j-1];  
  34.                 else  
  35.                 dp[i][j]=dp[i][i];  
  36.             }  
  37.         }  
  38.         out[1]=dp[n][n];  
  39.         out[3]=dp[n][k];  
  40.         //分成K个正整数的和 ,分为k个数中没有1,和有1,  
  41.         //dp[i][j],将i划分为j个dp[i][j]=dp[i-j][j]+dp[i-1][j-1];  
  42.         memset(dp,0,sizeof(dp));  
  43.         for(int i=1;i<=n;i++)  
  44.         for (int j=1;j<=i;j++)  
  45.         {  
  46.               if(j==1)  
  47.               dp[i][j]=1;  
  48.               else  
  49.               dp[i][j]=dp[i-j][j]+dp[i-1][j-1];   
  50.         }  
  51.         out[2]=dp[n][k];  
  52.        //奇数和dp[i][j]为划分最大的奇数不超过j的数,  
  53.        //则dp[i][j]=dp[i-n(j)][j]+dp[i][j-2];n(j)为不超过j的最大奇数  
  54.        //初始条件,dp[i][1]=1,j为偶数时候dp[i][j]=dp[i][j-1];当i==n(j) ,  
  55.        //出现dp[0][j],也就是当i为奇数时候,dp[0][j]=1;  
  56.        memset(dp,0,sizeof(dp));  
  57.        for(int i=0;i<=n;i++)  
  58.        {  
  59.            dp[i][1]=1;  
  60.            if(i&1)  
  61.            dp[0][i]=1;  
  62.         }  
  63.         for (int i=1;i<=n;i++)  
  64.         {  
  65.             for (int j=1;j<=n;j++)  
  66.             {  
  67.                 if(j&1)  
  68.                 {  
  69.                     if(j<=i)  
  70.                     dp[i][j]=dp[i-j][j]+dp[i][j-1];  
  71.                     else   
  72.                     dp[i][j]=dp[i][i];  
  73.                 }  
  74.                 else  
  75.                 dp[i][j]=dp[i][j-1];  
  76.             }  
  77.         }  
  78.         out[4]=dp[n][n];  
  79. //不同正整数和,dp[i][j]是不超过j的不同的整数和,dp[i][j]=dp[i-j][j-1]+dp[i][j-1];初始状态dp[1][1]=1;  
  80. //当i==j时,出现dp[0][j-1],表示先拿出一个j出来,这时候就应该是1中情况。  
  81.   
  82.         memset(dp,0,sizeof(dp));  
  83.         dp[0][0]=1;  
  84.         for (int i=0;i<=n;i++)  
  85.         {  
  86.               for (int j=1;j<=n;j++)  
  87.               {  
  88.                    if(j<=i)  
  89.                    dp[i][j]=dp[i-j][j-1]+dp[i][j-1];  
  90.                     else  
  91.                     dp[i][j]=dp[i][i];  
  92.               }  
  93.         }  
  94.         out[5]=dp[n][n];  
  95.         for (int i=1;i<=5;i++)  
  96.             {  
  97.                 cout<<out[i]<<endl;  
  98.             }  
  99.             cout<<endl;  
  100.   
  101.        }  
  102. }          

0 0
原创粉丝点击