部分和问题(dfs)

给定 n 个数,选出若干个,判断是否可以使它们的和恰好为 k 。

import java.util.*;

public class Main{
	public static int maxn = 1000;
	public static int n,k,flag=0;
	public static int[] a = new int[maxn+10];
	
	public static void dfs(int i,int sum){
		if(i>=n){
			return ;
		}
		else if(sum==k){
			flag = 1;
			return ;
		}
		else{
			dfs(i+1,sum+a[i]);
			dfs(i+1,sum);
		}
	}
	
	public static void main(String[] args){
		
		Scanner scanner = new Scanner(System.in);
		 n = scanner.nextInt();
		for(int i=0;i<n;i++){
			a[i] = scanner.nextInt();
		}
		 k = scanner.nextInt();
		dfs(0,k);
		if(flag==1){
			System.out.println("Yes");
		}
		else{
			System.out.println("No");
		}
	}
	
}
/*
4
1 2 4 7
13
Yes
*/

笔记:
1.写代码也要抓重点写,写写最重要的算法代码和函数代码,变量先无需定义,最后统一定义到main函数外面类的开头。
2.定义变量和方法一律用 public static
3.定义数组大小一律用int[] a = new int[maxn+10],maxn为数据范围。
4.dfs一次会把所有状态有且仅有遍历一遍,最终得出结果。
dfs框架
void dfs(尽可能少的必要参数,如遍历指针 i
和需要求解答案值)
{
if(终止条件)
{
return;
}
else if(求出答案)
{
return ;
}
else
{
各种有可能的情况
dfs(参数变化到终止条件和求出答案);
dfs(不同参数变化);
}

}
5.dfs图的时候,dfs一次,所有节点有且仅有访问一遍,求两点是否连通,就从一点出发dfs一次,另一点是否标记访问过,求图中共有多少连通子图就是求从不同点dfs结束了几次,选定不同点需要均未访问过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值