hdu 2616 dfs回溯暴力

来源:互联网 发布:c专家编程怎么样 编辑:程序博客网 时间:2024/05/30 23:49

点击打开链接

#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;elsecout<<-1<<endl;}return 0;}


0 0
原创粉丝点击