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             

 

posted @ 2012-08-10 18:55  zhongya  阅读(226)  评论(0编辑  收藏  举报