题意:给出有N种礼物,现在有M个客人要求礼品包装后送出。
如果有几种物品种是在一起,则可以用同一种包装纸进行包装。
不同的包装会用不同的包装纸。求最少用的包装纸数。
思路:一开始做时候是比赛,当时的状态很不好,一开始还以为是
以前做过的四色问题,就是最多可能有四种包装纸。后来才知道具体的题意,
是因为没有读懂题真正的意思。今天看了一点电影,激情大开,然后就做这个题,
看着只有50左右的礼物,直接可以用long long 型的位运算对其进行纪录并保存,
而且这样还会有操作方便的好处,所以就这样了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int li[55][55];
long long b[55];
int main()
{
freopen("in.txt","r",stdin);
int i,j,k;
int n,m;
int t;
cin>>t;
while (t--)
{
cin>>n>>m;
for (i=1;i<=m;i++)
{
b[i]=0;
for (j=1;j<=n;j++)
{
cin>>li[i][j];
b[i]=(b[i]<<1)+li[i][j];
//cout<<li[i][j]<<' ';
}
//cout<<endl;
//cout<<b[i]<<endl;
}
int ans=0;
long long cur=0;
for (i=1;i<=m;i++)
cur=cur|b[i];
long long temp=1;
//cout<<cur<<endl;
while (cur)
{
temp=1;
k=56;
while (k--)
{
if (temp&cur)
break;
temp=temp<<1;
}
long long mm=(1<<55)-1;
for (i=1;i<=m;i++)
{
if (temp&b[i])
mm=mm&b[i];
else
mm=mm&(~b[i]);
}
cur=cur&(~mm);
ans++;
//cout<<temp<<' '<<cur<<' '<<mm<<endl;
}
cout<<ans<<endl;
}
return 0;
}