给定整数a1,a2,....,an ,选若干数时它们的和为k。
解析:每个数有两种状态:加、不加。 全部n个数都决定其状态后进行判断。复杂度O(2n)
生成可行解空间多用dfs实现。
import java.util.Scanner; public class Main { static int n,k; static int[] a; static boolean dfs(int i,int sum){ //前n项都计算过了,则返回sum是否与k相等 if(i == n) return sum == k; //不加a[i] if(dfs(i+1,sum)) return true; //加a[i] if(dfs(i+1,sum+a[i])) return true; return false; } public static void main(String[] args) { Scanner in = new Scanner(System.in); n = in.nextInt(); a = new int[n]; for(int i = 0; i < n; i++){ a[i] = in.nextInt(); } k = in.nextInt(); if(dfs(0,0)) System.out.println("YES"); else System.out.println("NO"); } }