1834: 找数组

Memory Limit:128 MB Time Limit:1.000 S
Judge Style:Text Compare Creator:
Submit:49 Solved:14

Description

已知一个一维数组a[1..n](n<25),又已知一整数m。 如能使数组a中任意几个元素之和等于m,则输出YES,反之则为NO

(这一题类似我们经常玩的24点,随便给出4个数,通过加减乘除是否能算出24点)

Input

第一行有两个正整数n和m,其中1<=n<25,1<=m<=100000000 第二行有n个正整数,代表数组a,且数值均在[1,100000]内

Output

如能使数组a中任意几个元素之和等于m,则输出YES,反之则为NO

Sample Input Copy

5 10
1 3 5 7 9

Sample Output Copy

YES

HINT

【分析】对于一个已确定的数组a[1..n]和一个确定的数m,判断能否使数组a中任意几个元素之和等于m,等价于判断能否从数组a中取任意数使其和为m。 
对于a中任意元素a[n]只有取与不取两种情况:
(1)取a[n]: 
    则此时问题转化为:对于一个已确定的数组a[1..n-1]和一个确定的数m-a[n],判断能否使数组a[1..n-1]中任意几个元素之和等于m-a[n]。 
(2)不取a[n]: 
    则此时问题转化为:对于一个已确定的数组a[1..n-1]和一个确定的数m,判断能否使数组a[1..n-1]中任意几个元素之和等于m。 
    若用函数sum(n,m)表示能否从数组a[1..n]中取任意数使其和为m,只要sum(n-1,m-a[n])和sum(n-1,m)当中有一个值为真,则sum(n,m)为真,否则为假。因此,可以用递归来解此题。
递归终止条件为: 
      if (a[n]==m) sum=true; else if (n==1) sum=false;