题目链接:
https://nuoyanli.com/contest/38/problem/E
题面:
题意:
宠物最初捕捉几率为0,第一行输入两个数n、k,代表有n个技能,k如题意。第二行是n个用空格分隔的数,分别代表每一个技能能使用多少次
第三行也是n个用空格分隔的数,代表每一个技能可以增加多少捕捉几率
第四行还是n个用空格分隔的数,代表每一个技能的代价
如果可以捕捉输出最小的代价
否则输出NO
思路:
这道题目我比赛的时候就是总想着使用贪心去写,然而还是想错了 。其实这道题目是一个简单的dfs暴力搜索的题目,因为题目数据给的特别小,我们可以通过暴力搜索每一种情况来寻找每一种满足捕捉的情况时的代价,然后通过判断来得到最小的,所以这道题目正确的解法是使用dfs来解决问题(总归还是dfs学的太水了。。。 )。
参考代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int mine=10000;
int a[1000],b[1000],c[1000],n,k;
void dfs(int x,int y)
{
if(x>=k)//当捕捉的概率大于要捕捉的东西的概率时对其的代价开始继续判断
{
if(mine>y)//如果代价小于最小值,就把当前的代价赋值给最小值,始终保持最小值就是当前代价最小的情况
{
mine=y;
}
return;
}
for(int i=1; i<=n; i++)
{
if(a[i])
{
a[i]--;
dfs(x+b[i],y+c[i]);//通过a[i]的自加自减就可以遍历到每一种情况,实现把所有情况都搜索一遍,达到暴力广搜的作用
a[i]++;
}
}
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1; i<=n; ++i)
{
scanf("%d",&a[i]);
}
for(int i=1; i<=n; ++i)
{
scanf("%d",&b[i]);
}
for(int i=1; i<=n; ++i)
{
scanf("%d",&c[i]);
}
dfs(0,0);
if(mine==10000)//如果不存在一个数字满足小于mine的话,就证明不存在满足条件的情况,所以就无法捕捉,输出no
{
printf("NO");
}
else
{
printf("%d",mine);
}
return 0;
}