#include <bits/stdc++.h>
using namespace std;
const int maxn = 15;
int n, totalBlood;
int nomKill[maxn], maxKill[maxn];
int vis[maxn];
int ans;
bool ok;
//cnt:已经用了多少spell
//leftBlood:剩余的血
void dfs(int cnt, int leftBlood) {
if(leftBlood <= 0) {//找到答案
ans = min(ans, cnt);
return;
}
if(cnt > ans)//比找到的答案更差
return;
//用idx
for(int i = 0; i < n; ++i) {//还可以回过头去找
if(!vis[i]) {
vis[i] = 1;
if(leftBlood <= maxKill[i])
dfs(cnt+1, leftBlood - 2*nomKill[i] );
else
dfs(cnt+1, leftBlood - nomKill[i] );
vis[i] = 0;
}
}
}
int main() {
freopen("data.in", "r", stdin);
while(scanf("%d %d", &n, &totalBlood) == 2) {
for(int i = 0; i < n; ++i)
scanf("%d %d", &nomKill[i], &maxKill[i]);
memset(vis, 0, sizeof(vis));
ok = false;
ans = 99999999;
dfs(0, totalBlood);
if(ans < 99999999)
printf("%d\n", ans);
else
printf("-1\n");
}
return 0;
}
HDU 2616 Kill the monster(DFS)
最新推荐文章于 2021-01-23 21:03:04 发布