部分和(dfs)
/*
给定整数序列a1,a2,…,an,判断是否可以从中选出若干数,使它们的和恰好为k.
1≤n≤20
-10^8≤ai≤10^8
-10^8≤k≤10^8
样例:
输入
n=4
a={1,2,4,7}
k=13
输出:
Yes (13 = 2 + 4 + 7)
*/
package _8dfs;
import java.util.ArrayList;
/*
* 给定整数序列a1,a2。。。an,判断是否可以从中选出若干数,
* 使他们的和恰好为K
* 样例
* 输入:
* n =4
* a={1,2,4,5}
* k=13;
* 输出:
* yes(13=2+4+7)
*/
import java.util.Scanner;
public class 素数环 {
static int kk;
/**
* @param args
*/
/**
* @param args
*/
/**
* @param args
*/
/**
* @param args
*/
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int []r=new int[n]; //4
for(int i=0;i<n;i++) {
r[i]=sc.nextInt(); //1 2 4 7
}
int k=sc.nextInt(); //13
kk=k;//拷贝一份,不影响后面求和
dfs(r,k,0,new ArrayList<Integer>());
}
private static void dfs(int []a, int k, int cur,ArrayList<Integer>ints) { // cur可选的范围
if(k==0) { //证明找到了
System.out.print("Yes("+kk+"=");
int size=ints.size();
for (int i = 0; i <size; i++) {
System.out.print(ints.get(i)+(i==size-1?"":"+"));
}
System.out.println(")");
System.exit(0);
}
if(k<0||cur==a.length) {//撞墙了 返回
return;
}
//1dfs经典
//不要的状态
dfs(a,k,cur+1,ints);
//要的状态
ints.add(a[cur]);
int index=ints.size()-1;
dfs(a,k-a[cur],cur+1,ints);
ints.remove(index); //进行回溯(youdfs的地方一般都会做回溯)
}
}