问题描述
n个人参加某项特殊考试。
为了公平,要求任何两个认识的人不能分在同一个考场。
求是少需要分几个考场才能满足条件。输入格式
第一行,一个整数n(1<n<100),表示参加考试的人数。
第二行,一个整数m,表示接下来有m行数据
以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。输出格式
一行一个整数,表示最少分几个考场。
样例输入
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5样例输出
4
样例输入
5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5样例输出
5
参考代码
import java.util.Scanner;
public class Main {
public static int min=100;
public static int n,m;
public static int[][] whetherF; //判断是否认识,认识则为1,否则为0
public static int[][] examRoom; //考场中的学生
public static int[] stuNum; //各考场学生人数
public static void solve(int id,int num){ //id表示学生,num表示当前考场的编号
if(num>=min)
{
return; //当现在安排的数量大于最小的教室数量则返回
}
if(id>n)
{
min=Math.min(min,num); //安排的学生已大于学生人数,意味着已经安排完所有的学生
return;
}
for(int i=1;i<=num;i++) //首先看之前的房间是否能放进去
{
int stuInRm=stuNum[i];
int UFnum=0;
for(int j=1;j<=stuInRm;j++)
{
if(whetherF[id][examRoom[i][j]]==0)
{
UFnum++;
}
} //得到与此人不认识的人数
if(UFnum==stuInRm) //当前学生与该考场中的学生都不认识
{
examRoom[i][++stuNum[i]]=id; //将该学生存到这个考场中
solve(id+1,num);
stuNum[i]--;
}
}
//新增一个考场
examRoom[num+1][++stuNum[num+1]]=id; //没有的话就把它放到下一个教室里
solve(id+1,num+1);
--stuNum[num+1];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scn = new Scanner(System.in);
n = scn.nextInt();
m = scn.nextInt();
whetherF=new int[110][110];
examRoom=new int[110][110]; //ExamRoom[1][1] = 2,examRoom[1][2] = 0;表示考场1里面第一个存在的人是2,然后后面一位是0,也就是不存在人了,那么这时该考场只有一个人
stuNum=new int[110]; //各考场学生人数
while(m-->0)
{
int a = scn.nextInt();
int b = scn.nextInt();
whetherF[a][b]=whetherF[b][a]=1;
} //对认识的人做标记
solve(1,0);
System.out.println(min);
scn.close();
}
}