给定 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结束了几次,选定不同点需要均未访问过。