ZOJ 2358 || POJ 1775
刚看到这题时本想着拿它来练习下DFS来着可是被坑了一下午让我与苦无泪,回来检查代码时,发现自己吧0这个特殊的数忘记考虑了,T_T。。。。
思路:用DFS搜索出所有可能的情况然后打表输出。
View Code
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define N 1000005 5 6 int fac[11] = {0,1,1,2,6,24,120,720,5040,40320,362880};//这里数组要注意。。fac[0] = 0,fac[1]代表了0的阶乘,fac[2]代表了1的阶乘,以此类推。 7 int vis[11], sum; 8 int num[2000],flag,k,temp; 9 int hash[N]; 10 11 void DFS(int x) 12 { 13 int i; 14 15 if(sum != 0 && temp == flag) 16 { 17 num[k++] = sum; 18 } 19 for(i=x; i<=10; i++) 20 { 21 if(!vis[i] ) 22 { 23 flag++; 24 vis[i] = 1; 25 sum += fac[i]; 26 DFS(i); 27 flag--; 28 vis[i] = 0; 29 sum -= fac[i]; 30 31 } 32 } 33 } 34 35 int main() 36 { 37 int i,n; 38 39 memset(num,0,sizeof(num)); 40 k = 1; 41 for(i=1; i<=10; i++) 42 { 43 memset(vis,0,sizeof(vis)); 44 sum = 0; 45 flag = 0; 46 temp = i; 47 DFS(1); 48 } 49 for(i=0; i<k-1; i++) 50 num[i] = num[i+1]; 51 //printf("k = %d %d\n",k,num[0]); 52 memset(hash,0,sizeof(hash)); 53 for(i = 0; i < 1023; i++) 54 { 55 hash[num[i]] = 1; 56 } 57 58 while(scanf("%d",&n)!=EOF && n>=0) 59 { 60 if(hash[n] == 1) 61 printf("YES\n"); 62 else 63 printf("NO\n"); 64 } 65 return 0; 66 }
后来在网上看到了另外的解法,非常简洁容易理解,就是把n一次减去每个数的阶乘看看能不能使之为0。。反正我没想起来,在这里膜拜了YYY...
View Code
1 #include<stdio.h> 2 3 int main() 4 { 5 int i, n, num[11], m; 6 num[0] = 1; 7 num[1] = 1; 8 9 for(i=2; i<11; i++) 10 { 11 num[i] = num[i-1]*i; 12 } 13 14 while(scanf("%d",&n) && n>=0 ) 15 { 16 m = n; 17 if(!m) 18 { 19 printf("NO\n"); 20 continue; 21 } 22 for(i=10; i>=0; i--) 23 { 24 if(num[i] <= m) 25 m -= num[i]; 26 if(m <= 0) 27 break; 28 } 29 if( !m ) 30 printf("YES\n"); 31 else 32 printf("NO\n"); 33 } 34 return 0; 35 } 36 37