http://acm.hdu.edu.cn/showproblem.php?pid=2616
分析:排列树水过
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=15;
int cost[NM],x[NM],spe[NM],mmin,n;
void DFS(int t,int MP,int cc)
{
if(MP<=0){
if(cc<mmin) mmin=cc;
return;
}
if(t>n || cc>=mmin) return;
for(int i=t;i<=n;i++){
int temp;
swap(x[t],x[i]);
if(MP<=spe[x[t]]) temp=cost[x[t]]*2;
else temp=cost[x[t]];
DFS(t+1,MP-temp,cc+1);
swap(x[t],x[i]);
}
}
int main()
{
int M,i;
while(~scanf("%d%d",&n,&M)){
for(i=1;i<=n;i++){
scanf("%d%d",&cost[i],&spe[i]);
x[i]=i;
}
mmin=n+1;
DFS(1,M,0);
if(mmin>n) printf("-1\n");
else printf("%d\n",mmin);
}
return 0;
}