Computer program practice---题目总结
T1:穷举搜索
现在有长度为n的数列A和整数m。请编写一个程序,判断A中任意几个元素相加是否能得到m。A中的每一个元素只能用一次。数列A以及用作问题的q个Mⅰ由外界输入,请对每一个问题回答yes或no。
输入:第一行输入n,第二行输入代表A的n个整数,第3行输入q,第4行输入q个整数Mⅰ。
输出:输出各个问题的答案,如果能得到m,就输出yes,否则输出no。
限制:n≤20
q≤200
1≤A₁≤2000
1≤A₁≤2000
分析:
由于n的数目较小,所以可以将每一种情况列举出来,因为每种数有选或不选两种情况,所以复杂度为2ⁿ。
程序:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,a[105],pd,q,m,p;
int dfs(int k)//当前正在决定第k个数
{
p+=a[k];//选a[k]
if(p==m)
pd=1;
if(p>m)
{
p-=a[k];//如果p值已经大于m₁,那么就不能选有a[k]的情况
return 0;
}
if(pd)
return 0;
dfs(k+1);//继续选下一个
p-=a[k];//如果不选这一个
dfs(k+1);//讨论不选这一个的情况
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);//排序,方便提前找到合适的数。
cin>>q;
for(int i=1;i<=q;i++)
{
cin>>m;
dfs(1);//从第一个数开始选起
if(pd)
cout<<"yes\n";
else
cout<<"no\n";
pd=0;//将数值清零
p=0;
}
return 0;
}