前言
这是一道状态压缩的例题
状态压缩:用二进制的0和1表示2种状态
for(int i=0;i< (1<<n);i++) // 遍历每一种状态
for(int j=0;j<n;j++)
if(i&(1<<j)) //1每一次向左移动再&i得到i的每一位1对应的值
全集的补集:
bu = (1<<n)-1-i;
列举所有没有被用的状态:

遍历集合的子集:
for(int j=bu;j>0;j=(j-1)&bu)
一、题目详情

二、解题代码
#include<iostream>
using namespace std;
const int N=1e5+5;
int n,a[N],b[N];
int ans;
int main()
{
cin >> n;
for(int i=0;i<n;i++) cin >> b[i];
for(int i=0;i< (1<<n);i++)
for(int j=0;j<n;j++)
if(i & (1<<j))
a[i] += b[j];
for(int i=0;i< (1<<n);i++)
{
int bu = (1<<n)-1-i;
for(int j=bu;j>0;j=(j-1)&bu)
if(a[i]==a[j]) ans = max(ans,a[j]);
}
cout << ans;
return 0;
}
1056

被折叠的 条评论
为什么被折叠?



