UVa 1377 / LA 3667 Ruler

之前WA是被这组数据卡掉了:

4

5 15 25 35

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <queue>
  5 #include <algorithm>
  6 
  7 using namespace std;
  8 
  9 struct node
 10 {
 11     int Haash;
 12     int use[8];
 13     int count;
 14 };
 15 
 16 
 17 bool vis[ (1 << 22) + 10 ];
 18 int d[54];
 19 int n, cnt;
 20 int idx[1000100];
 21 
 22 bool check( int a, int cur )
 23 {
 24     for ( int i = 0; i < cur; ++i )
 25         if ( d[i] == a ) return false;
 26     return true;
 27 }
 28 
 29 bool IfEnd( int a )
 30 {
 31     //printf( "all = %d\n", ( 1 << cnt ) - 1 );
 32     if ( a == (1 << cnt) - 1 ) return true;
 33     return false;
 34 }
 35 
 36 void chuli( node &cur, int add )
 37 {
 38     for ( int i = 0; i < cur.count; ++i )
 39     {
 40         int c = abs( add - cur.use[i] );
 41         if ( idx[c] != -1 ) cur.Haash |= ( 1 << idx[c] );
 42     }
 43 
 44     cur.use[ cur.count++ ] = add;
 45 
 46     sort( cur.use, cur.use + cur.count );
 47 
 48     return;
 49 }
 50 
 51 bool IfSame( int *num, int nn, int tar )
 52 {
 53     for ( int i = 0; i < nn; ++i )
 54         if ( num[i] == tar ) return true;
 55 
 56     return false;
 57 }
 58 
 59 node BFS()
 60 {
 61     memset( vis, false, sizeof(vis) );
 62     queue<node> Q;
 63 
 64     node st;
 65     st.Haash = 1;
 66     st.count = 1;
 67     st.use[0] = 0;
 68     vis[ st.Haash ] = true;
 69     Q.push( st );
 70 
 71     while ( !Q.empty() )
 72     {
 73         node cur = Q.front();
 74         Q.pop();
 75         //printf( "cnt=%d last=%d hash=%d\n", cur.count, cur.last, cur.Haash );
 76         if ( IfEnd( cur.Haash ) ) return cur;
 77 
 78         for ( int i = 0; i < cur.count; ++i )
 79         {
 80             for ( int j = 0; j < cnt; ++j )
 81             {
 82                 if ( cur.Haash & ( 1 << j ) ) continue;
 83 
 84                 int x = cur.use[i] + d[j];
 85                 if ( IfSame( cur.use, cur.count, x ) || x > d[ cnt - 1 ] ) continue;
 86 
 87                 node temp = cur;
 88                 chuli( temp, x );
 89 
 90                 if ( !vis[ temp.Haash ] )
 91                 {
 92                     vis[ temp.Haash ] = true;
 93                     if ( IfEnd( temp.Haash ) ) return temp;
 94 
 95                     Q.push(temp);
 96                 }
 97             }
 98 
 99             for ( int j = 0; j < cnt; ++j )
100             {
101                 if ( cur.Haash & ( 1 << j ) ) continue;
102 
103                 int x = cur.use[i] - d[j];
104                 if ( IfSame( cur.use, cur.count, x ) || x > d[ cnt - 1 ] || x < 0 ) continue;
105 
106                 node temp = cur;
107                 chuli( temp, x );
108 
109                 if ( !vis[ temp.Haash ] )
110                 {
111                     vis[ temp.Haash ] = true;
112                     if ( IfEnd( temp.Haash ) ) return temp;
113 
114                     Q.push(temp);
115                 }
116             }
117         }
118     }
119 
120     return st;
121 }
122 
123 int main()
124 {
125     int cas = 0;
126     while ( scanf( "%d", &n ), n )
127     {
128         d[0] = 0;
129         cnt = 1;
130         for ( int i = 0; i < n; ++i )
131         {
132             int a;
133             scanf( "%d", &a );
134             if ( check( a, cnt ) ) d[ cnt++ ] = a;
135         }
136         sort( d, d + cnt );
137 
138         memset( idx, -1, sizeof(idx) );
139         for ( int i = 0; i < cnt; ++i ) idx[ d[i] ] = i;
140 
141         node ans = BFS();
142 
143         printf( "Case %d:\n", ++cas );
144         printf( "%d\n", ans.count );
145         for ( int i = 0; i < ans.count; ++i )
146         {
147             if ( i ) putchar(' ');
148             printf( "%d", ans.use[i] );
149         }
150         puts("");
151     }
152     return 0;
153 }
原文地址:https://www.cnblogs.com/GBRgbr/p/3109919.html