UVa 11025 The broken pedometer【枚举子集】

题意:给出一个矩阵,这个矩阵由n个数的二进制表示,p表示用p位二进制来表示的一个数 问最少用多少列就能将这n个数区分开

 

 

枚举子集,然后统计每一种子集用了多少列,维护一个最小值

b[i]==1代表的是选择了这一列

 1 #include<iostream>  

 2 #include<cstdio>  

 3 #include<cstring> 

 4 #include <cmath> 

 5 #include<stack>

 6 #include<vector>

 7 #include<map> 

 8 #include<set>

 9 #include<queue> 

10 #include<algorithm>  

11 using namespace std;

12 

13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)

14 

15 typedef long long LL;

16 const int INF = (1<<30)-1;

17 const int mod=1000000007;

18 const int maxn=100005;

19 

20 int b[maxn],a[505][505];

21 int minn,n,p;

22 

23 void solve(){

24     for(int i=0;i<n-1;i++){        

25         for(int j=i+1;j<n;j++){

26             int flag=0;            

27             for(int k=0;k<p;k++)

28                 if(b[k]&&a[i][k]!=a[j][k]) flag=1;//b[k]==1代表的是选择了这一列 

29 

30             if(flag==0) return;

31         }        

32     }

33     

34     int ans=0;

35     for(int i=0;i<p;i++)

36     if(b[i]) ans++;

37     

38 //    printf("ans=%d\n",ans);

39 //    printf("minn=%d\n",minn);

40     minn=min(minn,ans);

41 }

42 

43 void subset(int cur){

44     if(cur==p){

45         solve();

46         return;

47     }

48     b[cur]=1;

49     subset(cur+1);

50     b[cur]=0;

51     subset(cur+1);    

52 } 

53 

54 int main(){

55 //    freopen("in.txt","r",stdin);

56 //    freopen("out.txt","w",stdout);

57     int T;

58     cin>>T;

59         while(T--){

60             cin>>p>>n;

61             for(int i=0;i<n;i++)

62              for(int j=0;j<p;j++)

63              cin>>a[i][j];

64              

65              minn=p;

66              subset(0);

67              printf("%d\n",minn);

68         }

69     return 0;    

70 }
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

自己做的时候题目都没有读懂----sad------------

加油加油--

你可能感兴趣的:(dom)