第2关:子集和数(回溯法-回溯算法)

  • 任务描述
  • 相关知识
  • 编程要求
  • 测试说明

    任务描述

    本关任务:理解回溯算法;

    相关知识

    为了完成本关任务,你需要掌握:子集和数;

    子集和数例题

    已知n个不重复的正数:wi​, 1<=i<=n, 和M,要求找出wi​的所有子集使得子集内元素之和等于M。

    题目分析

    既然该序列不包含重复数字,那么子集的个数肯定是2n(因为求子集时对每个元素都有选或者不选两个操作),算法的时间复杂度就是O(2n)。

    ,

    编程要求

    根据提示,在右侧编辑器补充代码,完成子集和数。

    测试说明

    平台会对你编写的代码进行测试:

    输入 n,m;n为数的个数。m为和数的大小。 输出 选取方案,具体哪些数。

    测试输入:

     
  • 4 5
  • 1 3 2 4

    • 开始你的任务吧,祝你成功!

    • 7
    • 2 5
    • 6 2 -1
    • 3 4
    • 3 5 -1
    • 1 -1 7
    • 1 2 4
    • 1 2 5 -1
    • 1 6
    • 1 3 4 -1
    • 预期输出:

       

      测试输入:

       
    • 10 7
    • 1 3 6 2 5 4 -1 9 7 10
    • 预期输出:

       
    • 1 3
    • 2 4
    • #include<iostream>
      #include<cstdio>
      #include<algorithm>
      #include<queue>
      using namespace std;
      /********** Begin **********/
      // 定义函数、全军数组、结构体等。 
      void search(int *f,int* a,int idx,int n,int m){
          if(idx==n){
              int s=0;
              for(int i=0;i<n;i++){
                  if(a[i]==1) s+=f[i];
              }
              if(s==m){
                  for(int i=0;i<n;i++)
                  if(a[i]==1) cout<<f[i]<<" ";
                  cout<<endl;
              }
              return;
          }
          a[idx]=0;
          search(f,a,idx+1,n,m);
          a[idx]=1;
          search(f,a,idx+1,n,m);
      }
      /********** End **********/
      int main(){
          /********** Begin **********/
          int n,m;
          cin>>n>>m;
          int f[n],a[n];
          for(int i=0;i<n;i++)cin>>f[i];
          search(f,a,0,n,m);
          /********** End **********/
          return 0;
      }
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁的梁小忠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值