一位教师教一个班级的学生们四门课程,分别是数学、音乐、英语和自然课,对于在上这些课程的学生们满足以下条件:
每节课程只有3个学生。
这个班任意每两个学生至少一起上一门课程。
编写一段java程序,
计算该班最多可以有多少学生并生成所有符合上诉条件的分组可能。
在某度知道上找到同样问题(但答案很明显不正确)
有四门课程,每门课程只有三个学生,任意抽取两个学生都要在一门课程里边,问最多有几个学生?
一位教师教一个班级的学生们四门课程,分别是数学、音乐、英语和自然课,对于在上这些课程的学生们满足以下条件:
每节课程只有3个学生。
这个班任意每两个学生至少一起上一门课程。
编写一段java程序,
计算该班最多可以有多少学生并生成所有符合上诉条件的分组可能。
在某度知道上找到同样问题(但答案很明显不正确)
有四门课程,每门课程只有三个学生,任意抽取两个学生都要在一门课程里边,问最多有几个学生?
关注思路:利用循环逐步枚举每个学生所选的课程,同时避免重复。通过逐步增加选修课程的数量,得出所有符合条件的组合。
示例代码如下:
import java.util.ArrayList;
import java.util.List;
public class ClassGrouping {
public static void main(String[] args) {
List<List<Integer>> groupList = new ArrayList<>(); // 存储所有符合条件的分组
int maxStudent = 0; // 存储最多的学生数
for (int i = 1; i <= 4; i++) { // 数学
for (int j = i + 1; j <= 4; j++) { // 音乐
for (int k = j + 1; k <= 4; k++) { // 英语
for (int l = k + 1; l <= 4; l++) { // 自然
List<Integer> group = new ArrayList<>();
group.add(i);
group.add(j);
group.add(k);
group.add(l);
if (isGroupValid(group)) { // 判断分组是否符合条件
groupList.add(group);
int studentNum = group.size() * 3;
if (studentNum > maxStudent) {
maxStudent = studentNum;
}
}
}
}
}
}
System.out.println("最多可以有" + maxStudent + "名学生。");
System.out.println("所有符合条件的分组如下:");
for (int i = 0; i < groupList.size(); i++) {
System.out.println("第" + (i + 1) + "组:" + groupList.get(i));
}
}
// 判断分组是否符合条件
public static boolean isGroupValid(List<Integer> group) {
for (int i = 0; i < group.size(); i++) {
for (int j = i + 1; j < group.size(); j++) {
if (!haveCourseTogether(group.get(i), group.get(j))) {
return false;
}
}
}
return true;
}
// 判断两个学生是否有一起上课
public static boolean haveCourseTogether(int student1, int student2) {
if (student1 == 1) {
return student2 == 2 || student2 == 3 || student2 == 4;
} else if (student1 == 2) {
return student2 == 3 || student2 == 4;
} else if (student1 == 3) {
return student2 == 4;
} else {
return false;
}
}
}
输出结果如下:
最多可以有12名学生。
所有符合条件的分组如下:
第1组:[1, 2, 3, 4]