编写一个程序,读取由 n 个元素组成的序列 A 和一个整数 M,如果可以通过在 A 中的元素相加得到 M,则输出“yes”,否则输出“no”。 一个元素只能使用一次。
给出序列 A 和 q 个问题,其中每个问题都包含Mi
输入
在第一行中给出了 n。 在第二行中,给出了 n 个整数。 在第三行中给出了 q。 然后,在第四行,给出 q 个(Mi)。
输出
对于每个Mi打印"yes"或"no"。
约束
n ≤ 20
q ≤ 200
1 ≤ A 中的元素 ≤ 2000
1 ≤Mi≤ 2000
输入样例
5
1 5 7 10 21
8
2 4 17 8 22 21 100 35
输出样例
no
no
yes
yes
yes
yes
no
no
递归
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int can(int a[],int n,int m,int i)
{
if(m==0)
return 1;
if(m<0||i>=n)
return 0;
if(can(a,n,m-a[i],i+1)==1)
return 1;
return can(a,n,m,i+1);
}
int main()
{
int n,k;
int a[21],m;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d",&m);
if(can(a,n,m,0)==1)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}