- 任务描述
- 相关知识
- 编程要求
- 测试说明
任务描述
本关任务:理解回溯算法;
相关知识
为了完成本关任务,你需要掌握:子集和数;
子集和数例题
已知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; }
-
第2关:子集和数(回溯法-回溯算法)
于 2023-10-31 21:59:16 首次发布