HDOJ1028(Ignatius and the Princess III)

Ignatius and the Princess III

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1476    Accepted Submission(s): 1056


Problem Description
"Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says.

"The second problem is, given an positive integer N, we define an equation like this:
  N=a[1]+a[2]+a[3]+...+a[m];
  a[i]>0,1<=m<=N;
My question is how many different equations you can find for a given N.
For example, assume N is 4, we can find:
  4 = 4;
  4 = 3 + 1;
  4 = 2 + 2;
  4 = 2 + 1 + 1;
  4 = 1 + 1 + 1 + 1;
so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. Now, you do it!"
 

Input
The input contains several test cases. Each test case contains a positive integer N(1<=N<=120) which is mentioned above. The input is terminated by the end of file.
 

Output
For each test case, you have to output a line contains an integer P which indicate the different equations you have found.
 

Sample Input
4
10
20
 

Sample Output
5
42
627

貌似很难的样子,记得以前学长是这么写的

 

 

#include <stdio.h>
#define N 124

int Fen[N][N] = {0};

void Calc()
{
    
int i,j;
    
for(i = 1; i <= 120; i++)
        
for(j = 1; j <= 120; j++)
            
if(i < 1 || j < 1)
                Fen[i][j] 
= 0;
            
else if(i == 1 || j == 1)
                Fen[i][j] 
= 1;
            
else if(i < j)
                Fen[i][j] 
= Fen[i][i];
            
else if(i == j)
                Fen[i][j] 
= Fen[i][j - 1+ 1;
            
else Fen[i][j] = Fen[i][j - 1+ Fen[i - j][j];
}


int main()
{
    
int n;
    Calc();
    
while(scanf("%d",&n) != EOF)
        printf(
"%d\n",Fen[n][n]);
    
return 0;
}

 

现在又变成母函数了,我得好好理解一下

 

 

//Accepted 1028 15MS 264K 520 B C++ Xredman 
#include <iostream>
using namespace std;

const int N = 125;

long cc[N], ans[N];


int main()
{
    
int n;
    
int i, j, k;
    
while(cin>>n)
    
{
        
for(i = 0; i <= n; i++)
        
{
            cc[i] 
= 1;//i = 1 + 1 + 1 +  + 1,有这种组成方式
            ans[i] = 0;
        }

        
for(i = 2; i <= n; i++)
        
{//前i个式子合并
            for(j = 0; j <= n; j++)
                
for(k = 0; k + j <= n; k += i)
                    ans[j 
+ k] += cc[j] ;
            
for(j = 0; j <= n; j++)
            
{
                cc[j] 
= ans[j];
                ans[j] 
= 0;
            }

        }

        cout
<<cc[n]<<endl;
    }

    
return 0;
}

 

相应课件 download>>

 

posted on 2009-04-25 10:31  Xredman  阅读(444)  评论(0编辑  收藏  举报

导航