编程语言
首页 > 编程语言> > Acwing---165. 小猫爬山 (Java)_DFS枚举

Acwing---165. 小猫爬山 (Java)_DFS枚举

作者:互联网

165. 小猫爬山

原题链接

①. 题目

在这里插入图片描述

②. 思路

③. 学习点

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