记录
卡了半天,check函数中的temp % ele ==0
写成了ele % temp == 0
就挺无语的
思路
这个晚上在补
代码
import java.util.*;
public class Main{
static List<List<Integer>> que = new ArrayList<>();
static int MIN = Integer.MAX_VALUE;
static int[] people;
public static void dfs(int index){
if(index==people.length)//到了叶子节点
{
MIN = Math.min(MIN,que.size());// 更新结果
return;
}
if(index>=MIN)// 剪枝, 就是如果当前的队伍数要大于等于上一次的结果的时候就不用继续了
return;
int temp = people[index];
for(int i=0;i<que.size();i++){// 遍历所有队伍
//能加入队伍
List<Integer> list = que.get(i);
if(check(list,temp)){
list.add(temp);
dfs(index+1);
list.remove(list.size()-1);//回溯哦
}
}
// 找不到合适的队伍,那么就是自建队伍
List<Integer> item =new LinkedList<>();
item.add(temp);
que.add(item);
dfs(index+1);
que.remove(que.size()-1);//这个注意要删除的是最后一个,回溯的固定操作
}
private static boolean check(List<Integer> list, int temp) {
for(Integer ele: list){
if(temp % ele ==0)
return false;
}
return true;
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
people = new int[n];
for(int i=0;i<n;i++){
people[i] = s.nextInt();
}
Arrays.sort(people);
// 因为对于第一个人来说是没有队伍的,所以第一个人就是直接新建队伍
List<Integer> item = new LinkedList<>();
item.add(people[0]);
que.add(item);
dfs(1);
System.out.println(MIN);
s.close();
}
}