//给你n个数,问你能不能组成sum,如果可以,有哪几种
//dfs可以,转化成二进制也是可以的
//知识点!!!
//^ & | ~ << >>几个位运算符
// ^ 异或 相同为0,不同为1
// & 逻辑与(and) 都为1是1,其余为0
// | 逻辑或 只要有一个是1就是1
// ~ 取反 1变0,0变1
// << 左移 a<<2 a先变成二进制,后面补2个0,变回十进制输出
// >> 右移 b>>3 b先变成二进制,删掉后三位,变回十进制输出
#include<bits/stdc++.h>
using namespace std;
int a[22],sum,n;
int dp[1<<22],k[1<<22];
bool vis[22];
int lowbit(int i)
{
return i&-i;
}
int main()
{
for(int i=0;i<=20;i++)
k[1<<i]=i;
scanf("%d%d",&n,&sum);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int S=1;S<1<<n;S++)
{
memset(vis,0,sizeof(vis));
int t=lowbit(S);
dp[S]=dp[S-t]+a[k[t]];
if(dp[S]==sum)
{
for(int i=0;i<n;i++)
if(S>>i&1)printf("%d ",a[i]);
printf("\n");
}
}
}
位运算符
最新推荐文章于 2023-02-27 21:59:45 发布