首先要了解深搜的模板。dfs(所有情况),比如这题的两种情况,魔王的HP值是该减去一般情况所受伤害,还是该减去double伤害值呢????在搜索过程,记录搜索次数即可。
Description
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.
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).
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
<pre name="code" class="cpp">#include<stdio.h>
int a[20],b[20],n,w,c[20],min;
void dfs(int w,int z)
{
int i;
if(z>n)
return ;//攻击次数不能大于勇士所会的技能个数
if(w<=0)
{
if(z<min)
min=z;
return ;
}
for(i=0; i<n; i++)
{
if(!c[i])
{
c[i]=1;//标记
if(w<=b[i])
dfs(w-2*a[i],z+1);//搜索
else
dfs(w-a[i],z+1);
c[i]=0;
<span style="font-family: Arial, Helvetica, sans-serif;">//用过的技能不能再用</span>
}
}
}
int main()
{
int i;
while(scanf("%d%d",&n,&w)!=EOF)
{
for(i=0; i<n; i++)
{
scanf("%d%d",&a[i],&b[i]);
c[i]=0;
}
min=20;
dfs(w,0);
if(min==20)
printf("-1\n");
else
printf("%d\n",min);
}
return 0;
}