A - Kill the monster

A - Kill the monster 

There is a mountain near yifenfei’s hometown. On the mountain lived a big monster. As a hero in hometown, yifenfei wants to kill it.
Now we know yifenfei have n spells, and the monster have m HP, when HP <= 0 meaning monster be killed. Yifenfei’s spells have different effect if used in different time. now tell you each spells’s effects , expressed (A ,M). A show the spell can cost A HP to monster in the common time. M show that when the monster’s HP <= M, using this spell can get double effect.

Input

The input contains multiple test cases.
Each test case include, first two integers n, m (2<n<10, 1<m<10^7), express how many spells yifenfei has.
Next n line , each line express one spell. (Ai, Mi).(0<Ai,Mi<=m).

Output
For each test case output one integer that how many spells yifenfei should use at least. If yifenfei can not kill the monster output -1.



Sample Input
3 100
10 20
45 89
5  40

3 100
10 20
45 90
5 40

3 100
10 20
45 84
5 40
Sample Output
3
2
-1
           
题意:一个勇敢的孩子带着 n 个技能,上山打怪兽。   这n个技能,有着普攻和暴击两种伤害。当怪兽的血量小于某个技能的Mi时,这个孩子可使用暴击,伤害翻倍。

思路:深搜每种情况,找到最优解。

代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int book[15];
struct xie
{
    int A,M;
}X[15];
int step,n,m;
void dfs(int s,int st)
{
    if(s<=0)                //剪枝
    {
        if(step>st)
            step=st;
         return;
    }
    for(int i=1;i<=n;i++)
    {
        if(book[i]==0)
        {
            book[i]=1;
             if(s<=X[i].M)
                dfs(s-2*X[i].A,st+1);           //怪兽血量少于M,减少普攻的两倍血。
            else
                dfs(s-X[i].A,st+1);            
            book[i]=0;                       //不要忘了。
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
            scanf("%d%d",&X[i].A,&X[i].M);
        step=11;                            //n的范围(2-10),step要大于10;
        dfs(m,0);
        if(step==11)
            printf("-1\n");
        else
            printf("%d\n",step);
    }
    return 0;
}
纠正以下代码的错误并解释:main文件:#include <stdio.h> #include <stdlib.h> #include <string.h> #include"practical6.h" int main() { adventureGame; int monster=1; int room=0; printf("Welcome to adventure game\n"); printf("Type help to check the command words\n"); while (scanf("%s",command)==1) {//Read a command from the user if (processCommand(&monster,&room)==0) break; return 0; } } c文件:#include <stdio.h> #include <stdlib.h> #include <string.h> #include "practical6.h" int processCommand(char *command, int *monster, int *room) { if(strcmp(command,"help")==0){ printf("Available commands:\n"); printf("look-look around the current room\n"); printf("north/n,south/s,east/e,west/w-Move in a direction\n"); printf("kill monster-Attack the monster\n"); printf("exit-exit the game\n"); return 1; } if(strcmp(command,"look")==0){ switch (*room){ case 0: printf("you are in a big hall, there is a courtyard to the east, and a bedroom lies to the south."); if(*monster==1) printf("There is a monster here."); if(*monster==0)printf("There is a dead monster here."); printf("\n"); break; case 1: printf("You are in the courtyard, there is a big hall to the west, and a dining room lies to the south.\n"); break; case 2: printf("You are in the bedroom, there is a big hall to the north, and a dining room lies to the east.\n"); break; case 3: printf("you are in the dining room, there is a courtyard to the north, and a bedroom lies to the west.\n"); break; } return 1; } if(strcmp(command,"kill")==0 || strcmp(command,"kill monster")==0){ if(*room !=0){ printf("There is no monster here to kill.\n"); }else if (*monster==1){ printf("You slay the vile monster!\n"); *monster=0; } else { printf("The monster is already dead!\n"); } return 1; } if (strcmp(command,"exit")==0){ printf("You exit the game.\n"); return(0); } int processRoom0(char *command, int *monster, int *room){ if (strcmp(command,"east")==0 || strcmp(command,"e")==0) { printf("You go east to the courtyard.\n"); *room=1; //Change the player's location to be in the courtyard. return(1); } if (strcmp(command,"south")==0 || strcmp(command,"s")==0) { printf("You go south to the bedroom.\n"); *room=2; //Change the player's location to be in the bedroom. return(1); } if (strcmp(command,"north")==0 || strcmp(command,"n")==0) { printf("You cannot go north from here.\n"); return(1); } if (strcmp(command,"west")==0 || strcmp(command,"w")==0) { printf("You cannot go west from here.\n"); return(1); } } int processRoom1(char *command, int *monster, int *room){ if (strcmp(command,"east")==0 || strcmp(command,"e")==0) { printf("You cannot go east from here.\n"); return(1); } if (strcmp(command,"south")==0 || strcmp(command,"s")==0) { printf("You go south to the dining room.\n"); *room=3; return(1); } if (strcmp(command,"north")==0 || strcmp(command,"n")==0) { printf("You cannot go north from here.\n"); return(1); } if (strcmp(command,"west")==0 || strcmp(command,"w")==0) { printf("You go west to the big hall.\n"); *room=0; return(1); } } int processRoom3(char *command, int *monster, int *room){ if (strcmp(command,"east")==0 || strcmp(command,"e")==0) { printf("You cannot go east from here.\n"); return(1); } if (strcmp(command,"south")==0 || strcmp(command,"s")==0) { printf("You cannot go south from here.\n"); return(1); } if (strcmp(command,"north")==0 || strcmp(command,"n")==0) { printf("You go north to the courtyard.\n"); *room=1; return(1); } if (strcmp(command,"west")==0 || strcmp(command,"w")==0) { printf("You go west to the bedroom.\n"); *room=2; return(1); } } int processRoom2(char *command, int *monster, int *room){ if (strcmp(command,"east")==0 || strcmp(command,"e")==0) { printf("You go east to the dining room.\n"); *room=3; return(1); } if (strcmp(command,"south")==0 || strcmp(command,"s")==0) { printf("You cannot go to south from here.\n"); return(1); } if (strcmp(command,"north")==0 || strcmp(command,"n")==0) { printf("You go north to the big hall.\n"); *room=0; return(1); } if (strcmp(command,"west")==0 || strcmp(command,"w")==0) { printf("You cannot go to west from here.\n"); return(1); } } printf("Unknown command:%s.\n",command); switch(*room) { case 0: return processRoom0(command,monster,room); case 1: return processRoom1(command,monster,room); case 2: return processRoom2(command,monster,room); case 3: return processRoom3(command,monster,room); deafult: printf("Error: Invalid room number.\n"); return 0; } } h文件:typedef struct adventureGame { char command[1000]; int monster; // A flag indicating whether monster is alive or dead, initialized to alive int room; // The room the user is in. Initialized to start in room#0 } adventureGame; void processMovement(adventureGame *ag, char *direction, char *dir, char *mesg, int roomVal); int processCommand(adventureGame*ag); int processRoom0(adventureGame *ag); int processRoom1(adventureGame *ag); int processRoom2(adventureGame *ag); int processRoom3(adventureGame *ag);
最新发布
06-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值