部分和问题
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
-
输入
-
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
- 如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO” 样例输入
-
4 13 1 2 4 7
样例输出
-
YES 2 4 7
来源
- 经典题目 上传者
import java.util.*; public class Main { static int []ans=new int [30]; static int []a=new int [30]; static int cnt=0,m,n; static boolean flag=false,ci=false; public static void dfs(int i,int sum){ if(sum>=m||i>=n){ int j; if(cnt!=0&&sum==m){ if(!ci){ System.out.println("YES"); ci=true; } for(j=0;j<cnt-1;j++){ System.out.print(ans[j]+" "); } System.out.println(ans[j]); flag=true; } return; } ans[cnt++]=a[i]; dfs(i+1,sum+a[i]); cnt--; dfs(i+1,sum); return ; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); while(in.hasNext()){ n=in.nextInt(); m=in.nextInt(); flag=false; ci=false; cnt=0; for(int i=0;i<n;i++)a[i]=in.nextInt(); dfs(0,0); if(!flag)System.out.println("NO"); } } }
-
首先,n和k,n表示数的个数,k表示数的和。