代码如下:
# include <iostream>
using namespace std;
# define MAX 50
int n;
int A[MAX];
int qiongju(int i,int m){
if(m==0) return 1;
if(i>=n) return 0;
int res = qiongju(i+1,m) || qiongju(i+1,m-A[i]);//前面的用于存放,后面的用于做减法,如果能减到零,说明A【】数组中有一个或多个数能相加得到m
//为什么要有前面那步存储呢?因为后面的有可以存放后面减完的,如果只写了后面的代码,那很有可能会减出负数,而多了前面这一步存放,就能够不断的去尝试,但是会使用这个递归许多次,比较浪费存储空间 (或者符号,有一个成立则都整体成立返回真值)
return res;
}
int main()
{
cin>>n;
int i;
for(i=0; i<n; i++){
cin>>A[i];
}
int q;
cin>>q;
int m;
for(i=0; i<q; i++){
cin>>m;
if(qiongju(0,m)) cout<<"yes";
else cout<<"no";
cout<<endl;
}
return 0;
}