二进制枚举
主要思想:移位
例题:给出一个长度为 n 的序列 a 和一个目标值 s。从序列中选出 m(1≤m≤n) 个数组成一个新的序列,并且该序列中的所有元素的和等于 s。要求输出所有满足条件的序列。注意:相同的序列只输出一次。
用vector先将数保存下来,满足则输出。
#include<iostream> #include<vector> #include<algorithm> using namespace std; typedef long long ll; ll a[20]; int main() { ll n,s; cin>>n>>s; for(int i=0;i<n;i++) cin>>a[i]; ll m=(1<<n); for(int i=0;i<m;i++){ ll sum=0; vector<int> tr; for(int j=0;j<n;j++){ if((i>>j)&1){ sum+=a[j]; tr.push_back(a[j]); } } if(sum==s&&tr.size()){ cout<<tr.size()<<" "; for(int i=0;i<tr.size();i++) cout<<tr[i]<<" "; cout<<endl; } } return 0; }
Gambit