#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M=20;
typedef struct{
int x;
int y;
}Spell;
Spell s[M];
int n,visit[M],flag;
int Min;
void dfs(int cur,long m)
{
if(m<=0)
{
Min=min(Min,n-cur);
flag=1;
return;
}
if(cur==0)
{
if(m>0) return;
else
{
Min=min(Min,n-cur);
flag=1;
return;
}
}
if(Min<=n-cur) return; //最优性cut
int i,j,k;
for(i=0;i<n;i++)
{
if(!visit[i]) //暴力搜索全部解 当前可以用或不用这个spell
{
if(m<=s[i].y)
{
visit[i]=1;
dfs(cur-1,m-2*s[i].x);
}
else
{
visit[i]=1;
dfs(cur-1,m-s[i].x);
} //选完以后回溯
visit[i]=0; // 当前可以不选择这个spell
}
}
}
int main()
{
int m;
while(cin>>n>>m)
{
int i;
flag=0;
Min=1<<10;
memset(visit,0,sizeof(visit));
for(i=0;i<n;i++)
{
cin>>s[i].x>>s[i].y;
}
dfs(n,m);//用能用多少次spell 还有多少血
if(flag)
cout<<Min<<endl;
else
cout<<-1<<endl;
}
return 0;
}
hdu 2616 dfs回溯暴力
最新推荐文章于 2017-09-28 21:48:19 发布