部分和问题
时间限制:
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
-
-
简单dfs问题 两种策虐 选择当前和不选择当前数
-
java代码
-
import java.util.Scanner; /** * */ public class Main1058 { static int n, k; static int a[]=new int[25], b[]=new int[25]; public static void main(String[] args) { Scanner scanner=new Scanner(System.in); n=scanner.nextInt(); k=scanner.nextInt(); for (int i=0;i<n;i++){ a[i]=scanner.nextInt(); } if (dfs(0,0)){ System.out.println("YES"); for(int i = 0; i < n; ++i) if(b[i]==1) System.out.printf("%d ", a[i]); System.out.printf("\n"); }else { System.out.println("NO"); } } private static boolean dfs(int i, int sum) { if (i==n){ return sum==k; } b[i]=0; if (dfs(i+1,sum)){ return true; } b[i]=1; if (dfs(i+1,sum+a[i])){ return true; } return false; } }
-
首先,n和k,n表示数的个数,k表示数的和。