标签:
题意:给出一个矩阵,这个矩阵由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 }
自己做的时候题目都没有读懂----sad------------
加油加油--
UVa 11025 The broken pedometer【枚举子集】
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4472762.html