子集和
原创
给定一个集合Xn和一个整数m,从集合中找一个子集满足子集元素和相加得到m。
BFS解题
剪枝条件:
- 深度>n
- 剩下的元素和+当前的已选的元素和<m
import java.util.Scanner; class find{ private int n; //子集元素数目 private int c; //和 private int r=0; //目前剩下元素和 private int cw=0; //当前元素和 private int w[]; //元素 private int x[]; //结果向量 boolean flag=false; public find(int n,int c,int w[]){ this.n=n; this.c=c; this.w=w; x=new int[n+1]; for(int i=1;i<=n;i++){ r+=w[i]; } subsetSum(1); } public void subsetSum(int t){ if(t>n){ if(cw==c){ flag=true; } return; } if(t<=n){ if(cw==c){ flag=true; }else{ for(int i=0;i<=1;i++){ x[t]=i; if(i==0 && cw+r>=c){ subsetSum(t+1); if(flag==true){ return; } }else if(i==1 && cw+r>=c){ cw+=w[t]; r-=w[t]; subsetSum(t+1); if(flag==true){ return; } cw-=w[t]; r+=w[t]; } } } } } public void outPut(){ if(flag==true){ for(int i=1;i<=n;i++){ if(x[i]==1){ System.out.print(w[i]+" "); } } }else{ System.out.println("no solution"); } } } public class findZi { public static void main(String[] args) { Scanner reader=new Scanner(System.in); int n=reader.nextInt(); int c=reader.nextInt(); int w[]=new int[n+1]; for(int i=1;i<=n;i++){ w[i]=reader.nextInt(); } find fi=new find(n,c,w); fi.outPut(); } }
18:32:59
2018-11-08