poj1775

搜索,注意0是NO

View Code
   
     
#include < iostream >
#include
< cstdio >
#include
< cstdlib >
#include
< cstring >
using namespace std;

int fac[ 20 ];
bool f[ 1000005 ];
int tot;

void dfs( int i, int sum)
{
if (sum > 1000000 )
return ;
f[sum]
= true ;
if (i == tot)
return ;
dfs(i
+ 1 , sum + fac[i]);
dfs(i
+ 1 , sum);
}

int main()
{
// freopen("t.txt", "r", stdin);
fac[ 0 ] = 1 ;
tot
= 0 ;
for ( int i = 1 ; fac[i - 1 ] <= 1000000 ; i ++ )
{
fac[i]
= fac[i - 1 ] * i;
tot
++ ;
}
memset(f,
0 , sizeof (f));
dfs(
0 , 0 );
int n;
while (scanf( " %d " , & n), n >= 0 )
if (f[n] && n != 0 )
printf(
" YES\n " );
else
printf(
" NO\n " );
return 0 ;
}

你可能感兴趣的:(poj)