设当前的总和为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 );
}