AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 3. Brute Force :: Elementary Skills
// 11205 - The broken pedometer
#include <iostream>
#include <cstring>
using namespace std;
int check(int* c, int n)
{
for(int i=0; i<n; i++)
for(int j=i+1; j<n; j++)
if(c[i] == c[j])
return 0;
return 1;
}
int count(int k)
{
int s = 0;
while(k != 0)
{
s += k & 1;
k >>= 1;
}
return s;
}
int main(void)
{
int i, j, k, t, p, n, s, min;
int a[101][16], b[101], c[101];// 分别存放输入/输入的十进制形式/与运算结果
while(cin >> t)
while(t--)
{
memset(b, 0, sizeof(b));
cin >> p >> n;
for(i=0; i<n; i++)
for(j=0; j<p; j++)
{
cin >> a[i][j]; // 以“二进制”形式输入
b[i] += a[i][j]<<(p-j-1); // "二进制"转化为十进制
}
min = p;
for(k=0; k<(1<<p); k++) // 枚举所有子集(0~2^p-1)
{
for(j=0; j<n; j++)
c[j] = k & b[j]; // 与运算
if(check(c, n)) // 判重
{
s = count(k);
if(s < min) // 最开始遇到的不一定最小
min = s;
}
}
cout << min << endl;
}
return 0;
}