UESTC 1783 Krolia的礼包难题 规律题

来源:互联网 发布:java图形化编程 编辑:程序博客网 时间:2024/06/10 01:43

Krolia的礼包难题

Time Limit: 1000 ms Memory Limit: 65535 kB Solved:70 Tried: 313

Submit

Status

Best Solution

Back

Description

Krolia新开了一家礼品店,每天都要接到很多礼品的订购。Krolia送出去的礼品都需要包装。Krolia最后给顾客的是一个或者多个礼包,礼包里面装的礼物刚好是顾客订购的那些礼物。礼包由一些礼品组成,礼包里面每种礼品至多只能有一件。每一种礼包都需要包装纸。内容相同的礼包需要相同的包装纸,内容不同的礼包则需要不同的包装纸。Krolia希望包装纸的种类最少,因为设计一种包装纸很费事。并且Krolia要求一种礼品只能在一种礼包中出现,否则最后配送礼品的时候选择如何打包会很麻烦。现在Krolia的礼品店总共有n种礼品,已知明天客人的订购详细,问Krolia最少需要多少种包装纸。

Input

有多组测试数据。输入的第一行是整数T(0 < T<=100),表示测试数据的组数。每一组测试数据的第一行有两个整数,分别为整数n,m(1<=n,m<=50),表示有n种礼品,m个订购。接下来m行,每行n个数,第i个数为1表示该顾客的订单中购买了第i种礼品,为0则表示没有购买。

Output

每组测试数据一个整数,表示需要的最少包装纸种类数。

Sample Input

2
6 2
1 1 1 0 0 0
0 0 0 1 1 0
3 2
1 1 0
1 0 1

Sample Output

2
3

Hint

样例1:把礼品123打包成礼包1,需要一种包装纸。把礼品45打包成礼包2,需要一种包装纸。
样例2:把礼品1打包成礼包1,需要一种包装纸。把礼品2打包成礼包2,需要一种包装纸。把礼品3打包成礼包3,需要一种包装纸。最后给顾客1礼包12,给顾客2礼包13。

Source

KroliaFansClub



规律题 并且Krolia要求一种礼品只能在一种礼包中出现  注意这句话


在纸上写几组数据可以发现   只要一纵行是相同的可以作为一种礼包

所以只要找出纵行不同的个数


代码:

#include<stdio.h>int map[100][100];int lie[100];int main(){int cas,n,m,i,j,k,t,sum;scanf("%d",&cas);while(cas--){      scanf("%d %d",&n,&m);  int ans=n;  for(i=0;i<m;i++)  for(j=0;j<n;j++)  scanf("%d",&map[i][j]);/*    for(i=0;i<m;i++)  {  for(j=0;j<n;j++)  printf("%d ",map[i][j]);  printf("\n");  }*/  for(i=0;i<n;i++)  {  if(map[0][i]==-1) continue;                  sum=0;  for(j=0;j<m;j++)  { lie[j]=map[j][i];//每列赋值成功 sum+=lie[j];  }  if(sum==0) {ans--;continue;} for(k=i+1;k<n;k++)//与后面每列比较 { for(t=0;t<m;t++) if(lie[t]!=map[t][k]) break; if(t==m) {                                    for(t=0;t<m;t++)map[t][k]=-1; ans--; } }     }  printf("%d\n",ans);}return 0;}



原创粉丝点击