设当前的总和为i,最外层的数字为j,把最外层“剥去”后,剩下依然是满足要求的数列,且总和为i-2j,最外层的数字>=j。
即为:F(i,j)=∑F(i-2j,k)
#include <cstdio>
#include <string>
int N;
double f[300][300];
void dp ();
void pt ();
void print ();
int main ()
...{
dp ();
//pt ();
//freopen ( "in.txt", "r", stdin );
while ( scanf ( "%d", &N ) && N )
...{
print ();
}
return 0;
}
void dp ()
...{
int i, j, k;
memset ( f, 0, sizeof ( f ) );
for ( i = 1; i <= 250; i ++ )
...{
f[i][i] = 1;
for ( j = 1; j <= i / 2; j ++ )
...{
f[i][j] = 0;
if ( j * 2 == i )
f[i][j] = 1;
for ( k = j; k <= i - 2 * j; k ++ )
...{
f[i][j] += f[i - 2 * j][k];
}
}
}
}
void print ()
...{
int i;
double ans = 0;
for ( i = 1; i <= N; i ++ )
...{
ans += f[N][i];
}
printf ( "%d %.0f ", N, ans );
}
#include <string>
int N;
double f[300][300];
void dp ();
void pt ();
void print ();
int main ()
...{
dp ();
//pt ();
//freopen ( "in.txt", "r", stdin );
while ( scanf ( "%d", &N ) && N )
...{
print ();
}
return 0;
}
void dp ()
...{
int i, j, k;
memset ( f, 0, sizeof ( f ) );
for ( i = 1; i <= 250; i ++ )
...{
f[i][i] = 1;
for ( j = 1; j <= i / 2; j ++ )
...{
f[i][j] = 0;
if ( j * 2 == i )
f[i][j] = 1;
for ( k = j; k <= i - 2 * j; k ++ )
...{
f[i][j] += f[i - 2 * j][k];
}
}
}
}
void print ()
...{
int i;
double ans = 0;
for ( i = 1; i <= N; i ++ )
...{
ans += f[N][i];
}
printf ( "%d %.0f ", N, ans );
}