题目:给定整数序列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)
方法一:利用求子集方式判断那个子集中累加等于k
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
SolutionTest solution = new SolutionTest();
solution.subset(new int[]{1,2,4,7},13);
}
}
class SolutionTest {
public void subset(int[] arr,int k){
int n = arr.length;
int l = pow(2,n)-1;
for(int i = l;i>0;i--){
int num = 0;
List<Integer> list = new ArrayList<>();
for(int j = n-1;j>=0;j--){
if(((i>>j)&1) == 1){
num+=arr[j];
list.add(arr[j]);
}
}
if(num == k){
StringBuffer sb = new StringBuffer();
sb.append("Yes (").append(k).append(" = ");
for(int item : list){
sb.append(item).append(" + ");
}
System.out.println(sb.substring(0,sb.length()-3)+")");
break;
}
}
}
public int pow(int a,int n){
if(n == 0)return 1;
if(n == 1)return a;
int res = a;
int count = 1;
while(count*2<=n){
count*=2;
res*=res;
}
return res*pow(a,n-count);
}
}
方法二:回溯搜索

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
SolutionTest solution = new SolutionTest();
List<Integer> list = new ArrayList<>();
solution.dfs(13,new int[]{1,2,4,7},13,0,list);
}
}
class SolutionTest {
public void dfs(int kk,int[] arr,int k,int index,List<Integer>list){
if(k == 0){
StringBuffer sb = new StringBuffer();
sb.append("Yes (").append(kk).append(" = ");
for(int item : list){
sb.append(item).append(" + ");
}
System.out.println(sb.substring(0,sb.length()-3)+")");
return;
}
if(k<0 || index>=arr.length){
return;
}
dfs(kk,arr,k,index+1,list);
list.add(arr[index]);
int d = list.size()-1;
dfs(kk,arr,k-arr[index],index+1,list);
list.remove(d);
}
}
探讨如何从整数序列中找出特定和k的子集。提供了两种方法:通过生成所有可能的子集来检查是否存在和为k的子集;使用回溯搜索递归地寻找解决方案。
578

被折叠的 条评论
为什么被折叠?



