题意:给你n个数,它们可以组成2^n-1个非空集合,集合的值为集合中数的值的和,问第k小集合的值
思路:一个集合进行拓展,要么把最大的数换成更大的数,要么加上一个更大的数
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
#define maxn 250050
struct node
{
int pre,now,s;
friend bool operator<(node x,node y)
{
return x.s>y.s;
}
}a[maxn];int n,k;
int b[maxn];vector<int>sum;priority_queue<node>que;
void slove()
{
while(!que.empty()&&que.size()<=k+2)
{
node st=que.top();
que.pop();
//printf("now=%d s=%d\n",st.now,st.s);
sum.push_back(st.s);
if(st.now!=n)
{
que.push({st.now,st.now+1,st.s+b[st.now+1]});
que.push({st.pre,st.now+1,st.s-b[st.now]+b[st.now+1]});
}
}
}
int main()
{
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
}
sort(b+1,b+1+n);
que.push({0,1,b[1]});
slove();
printf("%d\n",sum[k-1]);
return 0;
}