题意:
至少用多少列来表示输入中的二进制数,并且表示的数里面没有重复,最多P列,N个二进制数
所以......表示的最大二进制数是2^P,那么在2^P方内的数二进制最大值是P个1,最小是0,所以,枚举2^P次方内的数k.和输入的二进制余,判断是否会重复,
如果没有重复,把k里面二进制是1的拿出来就是我们枚举的列
#include<stdio.h> #include<iostream> #include<sstream> #include<queue> #include<map> #include<memory.h> #include <math.h> #include<time.h> #include <stdlib.h> #include <algorithm> using namespace std; #define N 10 #define P 15 int a[N]; int b[1000]; int vis[N]; int main(const int argc, char** argv) { freopen("d:\1.txt", "r", stdin); int t1, p, n; cin >> t1; while (t1--) { memset(a, sizeof(a), 0); cin >> p >> n; for(int i = 0; i < n; i++) { int t2; for(int j = 0; j < p; j++) { cin >> t2; a[i] = a[i] * 2 + t2; } } int ans = 20; for(int i = 0; i < (1 << p); i++) { int flag = 0; int k = 0; for(int j = 0; j < n; j++) { int k2 = i & a[j]; for(int k3 = 0; k3 < k; k3++) if(b[k3] == k2) { flag = 1; break; } b[k++] = k2; } if(!flag) { int t = 0; for(int kk = 0; kk < p; kk++) { if(i & (1 << kk)) t++; } ans = t < ans ? t : ans; } } cout << ans << endl; ans = 20; } }