题目链接:UVa 11205 - The broken pedometer
使用位向量法求子集,然后求可以区分输入矩阵的不同行所需的最少列数,即最少使用的LED数目,使用了最简单的暴力法进行的比较(这样很慢),嗯,很黄很暴力。
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
//#define test
const int MAX_N = 100 + 10;
const int MAX_P = 15 + 5;
int map[MAX_N][MAX_P];
int vis[MAX_P];
int T,N,P,_max;
void solve()
{
bool flag = true;
int num = 0;
for(int i = 0;i < N - 1;i++)
{
for(int j = i + 1;j < N;j++)
{
flag = true;
for(int k = 0;k < P;k++)
{
if(vis[k] && map[i][k] != map[j][k])
flag = false;
}
if(flag)
return;//这两行完全相同
}
}
for(int m = 0;m < P;m++)
{
if(vis[m])
num++;
}
if(num < _max)
_max = num;
}
void subset(int cnt)
{
if(cnt == P)
solve();
else
{
vis[cnt] = 1;//第cnt个LED为1
subset(cnt+1);
vis[cnt] = 0;//第cnt个LED为0
subset(cnt+1);
}
}
int main()
{
#ifdef test
freopen("in.txt", "r", stdin);
#endif // test
cin>>T;
while(T--)
{
_max = MAX_P;
cin>>P>>N;
for(int i = 0;i < N;i++)
{
for(int j = 0;j < P;j++)
cin>>map[i][j];
}
subset(0);
cout<<_max<<endl;
}
return 0;
}