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;
}

原文地址:https://www.cnblogs.com/rainydays/p/2080957.html