#include<bits/stdc++.h>
using namespace std;
vector<int> v;
int a[110],vis[110];
int n,m,cnt,sum =0;
void dfs(int cur){
if(sum == m) {
//打印出所有可以的取数方式
for(int i=0;i<v.size();i++) cout<<v[i]<<" ";
cout<<endl;
cnt++;
return ;
}
else{
for(int i=cur;i<=n;i++){
//回溯法
sum += a[i];
v.push_back(a[i]);
dfs(i + 1);
sum -= a[i];
v.pop_back();
}
}
}
int main(){
cin>>n>>m;//n是待取的数字的个数 m是需要求和的数字
for(int i=1;i<=n;i++) cin>>a[i];
dfs(1);
cout<<cnt;//打印出有多少种取数的方式
return 0;
}
取数求和(C++回溯法)
于 2022-01-19 00:13:23 首次发布