Computer program practice---题目总结

Computer program practice---题目总结

T1:穷举搜索

  现在有长度为n的数列A和整数m。请编写一个程序,判断A中任意几个元素相加是否能得到mA中的每一个元素只能用一次。数列A以及用作问题的qMⅰ由外界输入,请对每一个问题回答yesno

输入:第一行输入n,第二行输入代表An个整数,第3行输入q,第4行输入q个整数Mⅰ。

输出:输出各个问题的答案,如果能得到m,就输出yes,否则输出no

限制:n20     

      q200

      1A₁≤2000

      1A₁≤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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值