UVa 11205 The broken pedometer

UVa 11205 The broken pedometer
枚举含p个元素的集合的子集,求出该子集和给定的若干个集合的交集,如果得到的这些交集都不相同,则该子集符合条件。题目要求求出符合条件的子集中最少含有多少个元素。
以下是我的代码:
#include < bitset >
#include
< algorithm >
#include
< cstdio >
#include
< cstring >
using   namespace  std;
const   int  kMaxp( 17 );
const   int  kMaxn( 107 );

bool  cmp( const  bitset < kMaxp >   & a, const  bitset < kMaxp >   & b)
{
    
return  (a.to_ulong() < b.to_ulong());
}

int  p,n,ans;
bitset
< kMaxp >  r[kMaxn];
bitset
< kMaxp >  used,t[kMaxn];

bool  OK()
{
    
for ( int  i = 1 ;i < n;i ++ )
        
if (t[i] == t[i + 1 ])
            
return   false ;
    
return   true ;
}

void  dfs( int  depth)
{
    
if (depth > p)
    {
        
for ( int  i = 1 ;i <= n;i ++ )
            t[i]
= r[i];
        
for ( int  i = 1 ;i <= n;i ++ )
            t[i]
= t[i] & used;
        sort(t
+ 1 ,t + n + 1 ,cmp);
        
if (OK())
            ans
= min(ans,( int )used.count());
        
return ;
    }
    dfs(depth
+ 1 );
    used[depth]
= 1 ;
    dfs(depth
+ 1 );
    used[depth]
= 0 ;
}

int  main()
{
    
/*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //
*/

    
int  T;
    scanf(
" %d " , & T);
    
while (T -- )
    {
        scanf(
" %d%d " , & p, & n);
        
for ( int  i = 1 ;i <= n;i ++ )
            r[i].reset();
        
for ( int  i = 1 ;i <= n;i ++ )
            
for ( int  j = 1 ;j <= p;j ++ )
            {
                
int  t;
                scanf(
" %d " , & t);
                r[i][j]
= t;
            }

        ans
= 315 ;
        used.reset();
        dfs(
1 );

        printf(
" %d\n " ,ans);
    }

    
return   0 ;
}

你可能感兴趣的:(UVa 11205 The broken pedometer)