计时器坏了
判断至少几列数字可以判断出这几个数字
子集
位向量法
#include <stdio.h>
#include <string.h>
int mat[105][20], b[20];
int min, p, n;
void subset(int cur){
if (cur == p) {
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++) {
bool flag = false;
for (int k = 0; k < p; k++)
if (b[k] && mat[i][k] != mat[j][k]) //选中的元素之中 两行之间至少要有一个元素不同
flag = true;
if (!flag)
return ;
}
int res = 0;
for (int i = 0; i < p; i++)
if (b[i])
res++; //选了几个元素
min = min > res ? res : min;
return ;
}
b[cur] = 1; //选第cur个元素
subset(cur + 1);
b[cur] = 0; //不选第cur个元素
subset(cur + 1);
}
int main(){
int t;
while (scanf("%d", &t) != EOF) {
while (t--) {
scanf("%d %d", &p, &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < p; j++)
scanf("%d", &mat[i][j]);
min = p;
memset(b, 0, sizeof(b));
subset(0);
printf("%d\n", min);
}
}
return 0;
}