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;
对于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;