高手才能回答
来源:百度知道 编辑:UC知道 时间:2024/05/23 02:16:39
对于一个已确定的数组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[’,