原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2616
分析:深搜一遍,输出最小武器数就好了。
我的代码:
#include<stdio.h>
int n,HP;
struct Node
{
int A;
int M;
};
Node p[10];
bool visited[10];
int ans;
int flag=0;
void DFS(int num,int HP) //num为武器使用数,HP为剩余HP。
{
if(num>=ans) return; //剪枝一:使用武器数比当前最小的武器数大了,就没必要在继续搜索了。
if(HP<=0)
{
flag=1;
ans=ans>num?num:ans; //找最小武器使用数。
}
for(int i=0;i<n;i++)
{
if(!visited[i])
{
visited[i]=1;
int nhp=HP-(p[i].M>=HP?2*p[i].A:p[i].A); //如果HP<M了就减2倍伤害。
DFS(num+1,nhp);
visited[i]=0;
}
}
}
int main()
{
while(~scanf("%d%d",&n,&HP))
{
int maxH=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].A,&p[i].M);
visited[i]=0;
maxH+=2*p[i].A;
}
if(maxH<HP) //剪枝二,如果最大伤害都小于HP,则直接输出。
{
printf("-1\n");
continue;
}
ans=0xffffff;
flag=0;
DFS(0,HP);
if(flag)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}
总结:很猛的剪枝一,直接把390MS减到了78MS;剪枝二没用-,- 。真不知道哪些大牛0MS的代码是怎么写的。。
本文详细分析并优化了解决HDU 2616问题的深搜算法,通过有效的剪枝策略显著减少了计算复杂度,将时间复杂度从390MS降低至78MS。文章深入探讨了算法优化过程,包括剪枝一和剪枝二策略的应用,以及最终输出最小武器使用数量的方法。
669

被折叠的 条评论
为什么被折叠?



