高手才能回答

来源:百度知道 编辑:UC知道 时间:2024/05/23 02:16:39
已知一个一维数组A[1..N] 。{N<50} 又已知一整数M。如能使数组A 中任意几个元素之和等于M,则输出YES,反之则为NO。(用pascal程序语言,否则我看不懂)

对于一个已确定的数组a[1] 至a[n]和一个确定的数m,判断能否使数组a中任意几个元素之和等于m,

等价于判断能否从数组a 中取任意数使其和为m。
此时若a[n]=m,则可以输出“YES”,否则若n=1,则可以输出“NO”。
否则可以按以下规则进行判断:对于a 中任意元素a[n]只有取与不取两种情况:

(1)取a[n]:
则此时问题转化为:对于一个已确定的数组a[1] 至a[n-1] 和一个确定的数m-a[n],判断能否使
数组a 中任意几个元素之和等于m。

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

Program zushu(input,output);
Const max=50;
Var

a:array[1..max] of integer;
n, m, i:integer ;
Function sum(n,m:integer):boolean;
Begin
if a[n]=m then sum:=true
else if n=1 then sum:=false

else sum:=sum(n-1,m-a[n]) or sum(n-1,m);
End;
Begin

write(’n=’);
readln(n);
for i:=1 to n do

begin
write(’a[’,