二进制枚举

主要思想:移位

例题:给出一个长度为 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; 
}

 

posted @ 2020-11-08 10:59  ideologue  阅读(38)  评论(0编辑  收藏  举报