hdu 2616 Kill the monster
题目大意:
yifenfei的家乡附近有一座山,山里住着一只大怪物。作为家乡的英雄,yifenfei决定去杀了这只怪物。
现在我们知道yifenfei有n种法术,怪物的血量为m,当怪物的 血量 <= 0 的时候意味着怪物被杀死了。在不同的时间使用不同的魔法,就有不一样的效果。现在通过表达式(A, M),告诉你每种魔法的效果。A表示这魔法能打掉怪兽A点血。M表示但怪兽的 血量 <= M的时候用这种魔法,魔法伤害加倍。
输入:
输入包含许多测试数据。每个测试前两个整数n,m(2 < n < 10, 1 < m < 10^7),n表示yifenfei的法术数量,m表示怪兽血量。接下来的n行,每行表示一个魔法 (Ai,Mi)。(0 < Ai, Mi <=m)。
输出:
每个用例输出一个整数,表示yifenfei杀死怪兽最少用的法术数目。如果yifenfei不能杀死怪兽输出-1。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 //记录法术伤害情况的数据结构 6 typedef struct Node 7 { 8 int A; 9 int M; 10 }Node; 11 12 Node spells[10]; 13 bool visit[10]; //标记数组,判断某法术是否使用过 14 int spellCount; //feifei拥有的法术数量 15 int minCount; //打死怪兽需要用的最少的法术数量 16 17 /* 数据初始化函数 */ 18 void init() 19 { 20 minCount = 10; 21 memset(visit, 0, sizeof(visit)); 22 } 23 24 /* dfs搜索 */ 25 void dfs(int count, int HP) 26 { 27 if (spellCount == count && HP > 0) //法术全用完了,怪兽HP > 0,返回false 28 return; 29 else if (minCount <= count && HP > 0) //当前用的法术数量比minCount还多,怪兽HP > 0,说明继续搜索没有价值了,返回false 30 return; 31 else if (minCount > count && HP <= 0) //当前使用的法术数量比minCount小,怪兽HP <=0,说明找到一种比之前好的方法。返回true 32 { 33 minCount = count; 34 return; 35 } 36 37 for (int i = 0; i < spellCount; ++i) 38 { 39 if (false == visit[i]) 40 { 41 visit[i] = true; 42 int harm = (HP <= spells[i].M ? 2 * spells[i].A : spells[i].A); 43 dfs(count + 1, HP - harm); 44 visit[i] = false; 45 } 46 } 47 } 48 49 int main(void) 50 { 51 int HP; //moster's HP 52 while (scanf("%d %d", &spellCount, &HP) != EOF) 53 { 54 init(); 55 for (int i = 0; i < spellCount; ++i) 56 scanf("%d %d", &spells[i].A, &spells[i].M); 57 dfs(0, HP); 58 if ( 10 != minCount ) 59 printf("%d\n", minCount); 60 else 61 printf("-1\n"); 62 } 63 return 0; 64 }