蓝桥杯 和为T java

蓝桥杯 和为T java

源码:
package second;
import java.util.LinkedList;
import java.util.Scanner;
public class Main{
static long a[];
static long T;
static int n;
static LinkedListl1=new LinkedList();

public static void main(String[] args) {
	Scanner in=new Scanner(System.in);
	n=in.nextInt();
	a=new long[n];
	for(int i=0;i<n;i++){
		a[i]=in.nextLong();
	}
	T=in.nextLong();
	dfs(n-1,0,new LinkedList<Long>());
	for (int i=0;i<l1.size();i++){
		System.out.println(l1.get(i));
	}
	System.out.println(l1.size());
}
public static void dfs(int floor,long curValue, LinkedList<Long> l2){
	for(int i=floor;i>=0;i--){
		l2.push(a[i]);
		dfs(i-1,curValue+a[i],l2);
		l2.pop();
	}
	if(curValue==T&&l2.size()!=0){
		l1.push(change(l2));
	}
}
public static String change(LinkedList<Long> l2){
	String s=l2.get(0).toString();
	for(int i=1;i<l2.size();i++){
		s+=" "+l2.get(i).toString();
	}
	return s;
}

}
说明
//双重倒序
//静态变量;a[n],T,n,linkedList l1(用于存放最后每组的答案)
//dfs 变量 floor (层数),curValue(当前值),l2:用于暂存可能为和T的值
//先倒叙dfs(n-1,0,l2),for(i=n-1;i>=0;i–){将当前值push到l2,递归dfs(i-1,curValue+a[i]) 将当前值pop }注意:每次循环后叶子节点都会减一所以这里为i-1,而不是floor-1
//当循环结束后则为dfs到尽头,if(curValue==T&&l2.size!=0){l1.push(change(l2))}

解析
注:斜体为节点,后面紧跟的为与它相连的点。
1 2 3 4 5
2 3 4 5
3 4 5
4 5
5

凡是能写成这种格式的就可以用dfs 求出任意相连点数的路径长度值,当满足上面表规律时(点点两两相连,本来每个点相连的都为n-1.但是这里为了简便起见,就做了一个特殊处理,比如1有点2,2就直接去掉点1,下面依次内推,就省去了标记已访问的问题),在dfs 方法for循环中 直接递归dfs(i-1,curValue+a[i],l2); (这里floor=i-1而不是floor=floor-1,这样做的目的是因为:当for循环每执行一次,下个节点对应的子节点就会减一)。另外,当各个点连接的点不是点点相连的时候(每个点所连接的点数量减少)的话,可采用ArrayList ,或栈或者链表来存储他们的节点,for循环他们的节点。

拓展:
dfs算法回顾:
DFS :1 访问顶点V
2 再从V的未被访问的邻接点中选一个顶点W ,从W出发再进行DFS。
3 重复2步骤,直到与V邻接点都被访问完为止
4 再重复123(选取未被访问的点替代V)
从单从顶点V 开始访问的DFS伪代码

  1. 访问顶点V (同时设置V 已被访问)
  2. W=V的第一个邻接点
  3. While(w存在){
    If(w未被访问)从顶点w出发递归执行该算法同时设置w已被访问;
    W=顶点v的下一个邻接点。
    }

猜你喜欢

转载自blog.csdn.net/Y734493585/article/details/88387342