问题描述:
给定整数序列a1,a2,…,an,判断是否可以从中选出若干数,使它们的和恰好为k.
样例:输入n=4 a={1,2,4,7} k=13
输出:Yes (13 = 2 + 4 + 7)
DFS代码见下(看注释理解):
import java.util.ArrayList;
import java.util.Scanner;
public class Bfst {
//部分和(dfs)
public static void dfs(int []a, int b, int c, ArrayList<Integer> arrayList)
{
if (b==0)//递归出口
{
System.out.print("yes"+"=");
for (int i=0;i<arrayList.size();i++)//结果打印
{
System.out.print(arrayList.get(i)+(i==arrayList.size()-1?"":"+"));
}
return;//若有别的情况,可继续搜索
}
if (b<0||c==a.length) return;
dfs(a,b,c+1,arrayList);//状态转移 表示不加入当前数字
arrayList.add(a[c]);//加入新数字
int index=arrayList.lastIndexOf(a[c]);
dfs(a,b-a[c],c+1,arrayList);//状态转移 表示加入当前数字
arrayList.remove(index);//回溯 除去最新加入的值
}
public static void main(String[] args) {
ArrayList<Integer> ss=new ArrayList<>();
Scanner a=new Scanner(System.in);//输入
int len=a.nextInt();
int []b=new int[len];
for (int i=0;i<=b.length-1;i++)
b[i]=a.nextInt();
int c=a.nextInt();
Bfst news=new Bfst();
news.dfs(b,c,0,ss);
}
}
运行效果:

254

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



