唉 改bug改了好久,,,今天剪了平头后就改出来了。。。感觉对递归的理解更深了一点。。。
package sy4.zw;
import java.util.ArrayList;
public class Problem5_1 {
private static ArrayList<Integer> answer = new ArrayList<>(); //目标和的数的子集
static int target = 0;
static ArrayList<Integer> s;
public static void main(String [] args){
int [] b ={2,18,4,8,5,7};
int sum = 30;
FindCollection(b,0,sum);
if(target ==sum){
for(Integer i:answer){
System.out.print(i+" ");
}
}
else{
System.out.println("not found");
}
}
/***
*
* @param a 数组用来存储S集合的元素
* @param i 第i个位置
* @param sum 子集和的目标值
* @return
*/
public static void FindCollection(int [] a,int i,int sum){
//当集合已经遍历完
if(i>a.length-1)
return;
当集合没有遍历完
else{
if(target+a[i]<sum){ //满足约束条件,进入左子树
target +=a[i];
answer.add((Integer) a[i]);
FindCollection(a,i+1,sum);//递归
if(target==sum) return; //在递归过程中找到解,就返回
target -=a[i]; //在递归过程中没有找到解
answer.remove((Integer)a[i]);
FindCollection(a,i+1,sum);
}
else if(target+a[i]==sum){
target +=a[i];
answer.add((Integer) a[i]);
return;
}
else {
FindCollection(a,i+1,sum);
}
}
}
}