您的位置:首页 > 其它

hdu 2616 dfs回溯暴力

2016-06-04 21:07 260 查看
点击打开链接

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: