

倚天照海花无数,流水高山心自知。
解法二:
#include<stdio.h>
long n,k,fac[] ={1,1,2,6,24,120,720,5040,40320,362880};
main(){
while(scanf(\"%ld\",&n)!=EOF&&n>=0){
for(k=9;k>=0&&n;k--)
if(n>=fac[k]) n -= fac[k];
printf(k<9&&!n?\"YES\n\":\"NO\n\");
}
return 0;
}
五楼的解法2的fac数组为什么前两个元素都是1呢?
输入10也应该输出yes吗?
搞不懂,麻烦哪位高手解答一下。
也许是我没理解题意?
/*贴出我写的*/
#include<stdio.h>
long data[10]={1,1,2,6,24,120,720,5040,40320,362880};
long cw=0,n;
int flag=0;
void Backtrack(int k)
{
if(k>9)
{
if(cw==n) flag=1;
return ;
}
if(cw+data[k]<=n)
{
cw+=data[k];
Backtrack(k+1);
cw-=data[k];
}
Backtrack(k+1);
}
int main()
{
while(EOF!=(scanf("%ld",&n))&&n>=0)
{
cw=0;
flag=0;
if(n!=0)
{
Backtrack(0);
}
if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}