题目描述
给定整数序列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)
解法一
import javafx.scene.transform.Scale;
import java.util.ArrayList;
import java.util.Scanner;
public class dfs_部分和 {
static void dfs(int []a, int k, int cur, ArrayList<Integer> ints){
if (k==0){
System.out.println("YES");
System.exit(0);
}
if (cur==a.length||k<0){
return;
}
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);
}
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for (int i = 0; i <n ; i++) {
a[i]=sc.nextInt();
}
int k=sc.nextInt();
dfs(a,0,k,new ArrayList<Integer>());
}
}
最优解法
import javafx.scene.transform.Scale;
import java.util.ArrayList;
import java.util.Scanner;
public class dfs_部分和 {
static void dfs(int []a, int k, int cur, ArrayList<Integer> ints){
if (k==0){
System.out.println("YES");
System.exit(0);
}
if (cur==a.length||k<0){
return;
}
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);
}
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for (int i = 0; i <n ; i++) {
a[i]=sc.nextInt();
}
int k=sc.nextInt();
dfs(a,0,k,new ArrayList<Integer>());
}
}
转载:https://www.cnblogs.com/xiaoyh/p/10346658.html
来源:CSDN
作者:小白学习笔记
链接:https://blog.csdn.net/weixin_43673156/article/details/104555289