题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2260
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<math.h>
using namespace std;
long long minn=INT_MAX;
long long tmp=0;
long long m;
int n;
struct Node{
int v;
char c;
Node(int x,char c0):v(x),c(c0){}
Node(){v=0;c='A';}
};
bool cmp(Node x,Node y)
{
return x.c<y.c;
}
Node node[26];
int b[26]={0};//ÅжÏÊÇ·ñ³öÏÖ¹ý
int result[26]={0};
void search(int);
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
{
cin>>node[i].c>>node[i].v;
}
sort(node,node+n,cmp);
memset(b,0,sizeof(b));
memset(result,0,sizeof(result));
tmp=0;
minn=INT_MAX;
search(0);
bool first=false;
int countt=0;
for(int j=0;j<n;j++)
if(result[j])
countt++;
cout<<countt<<endl;
for(int j=0;j<n;j++)
if(result[j])
{
if(!first)
cout<<node[j].c;
else
cout<<" "<<node[j].c;
first=true;
}
cout<<endl;
}
return 0;
}
void search(int k)
{
if(tmp-m>=minn)
return;//剪枝
int tmpp=tmp;
for(int q=k;q<n;q++)
tmpp+=node[q].v;
if(m-tmpp>minn)
return ;
if(k==n)
{
if(abs(tmp-m)<minn)
{
minn=abs(tmp-m);
for(int i=0;i<n;i++)
result[i]=b[i];
}
return ;
}
b[k]=1;
tmp+=node[k].v;
search(k+1);
b[k]=0;
tmp-=node[k].v;
search(k+1);
}