Acwing---165. 小猫爬山 (Java)_DFS枚举
作者:互联网
165. 小猫爬山
①. 题目
②. 思路
- 思路:如果当前组能填充下一个猫,小猫加入到老的缆车,如果当前组不能填充下一个猫,小猫加入到新的缆车,这题和分成质数思路一样,进行分组,使用DFS进行枚举,当全部的猫分好组,更新使用组的最小数量,若还有小猫,遍历所有创建的组,将小猫加进去,判断重量是否符合,若全部都不符合,直接创建一个新的组来存放,再进一步DFS枚举,
dfs(int cur,int maxGroup)
, cur指向当前哪只猫,maxGroup已经创建的全部组数量,最后注意的点就是回溯,回溯的时候直接在组数组中减去当前猫的体重
③. 学习点
DFS进行分组操作
④. 代码实现
import java.util.*;
public class _165_小猫爬山_dfs枚举 {
/*
*
本题只能用按小猫枚举来dfs
思路:
如果当前组能填充下一个猫,小猫加入到老的缆车
如果当前组不能填充下一个猫,小猫加入到新的缆车
*/
static int N=20,ans,n,w;
static int[] a=new int[N];
static int[] groupNum=new int[N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
ans=n;
w = sc.nextInt();
for (int i = 0; i <n; i++) {
a[i] = sc.nextInt();
}
dfs(0,0,0);
System.out.println(ans);
}
public static void dfs(int cur,int totalCnt,int maxGroup) {
//当猫的数量全部分好组
if(totalCnt==n) {
ans=Math.min(ans, maxGroup);
}
//递归出去的条件
if(maxGroup>=ans || cur>=n) {
return;
}
//加入之前的组
for(int i=1;i<=maxGroup;i++) {
//groupNum是在下标1开始
int nw=groupNum[i]+a[cur];
if(nw<=w) {
groupNum[i]=nw;
//递归 继续在当前组
dfs(cur+1,totalCnt+1,maxGroup);
//回溯
groupNum[i]-=a[cur];
}
}
//加入到新建的组
groupNum[maxGroup+1]+=a[cur];
//递归 猫+1 组数+1
dfs(cur+1,totalCnt+1,maxGroup+1);
//回溯
groupNum[maxGroup+1]-=a[cur];
}
}
标签:Java,cur,int,groupNum,DFS,---,maxGroup,dfs,小猫 来源: https://blog.csdn.net/weixin_45480785/article/details/113803172