同一个算法,数据规模越大,运行时间越长吗?——0-1背包之优先队列式分支限界法

本文探讨使用优先队列式分支限界法解决0-1背包问题时,数据规模如何影响运行时间。通过算法分析和实验验证,发现数据规模大但总重小于某个阈值时,运行时间会增加;而当总重大于或等于阈值,所有物品都能放入,算法能快速找到最优解,运行时间反而减少。结论强调了剪枝函数的重要性。
摘要由CSDN通过智能技术生成

写在前面

邻近期末,惰性上升,有点懒,除了做算法实验,就没怎么干其他的事,偶然又想起以前胡适之的日记lmao,言归正传,这次算法实验要求用优先队列式分支限界法解决0-1背包问题,但在调试过程中除了一些问题,一开始以为是Dev抽风(尤记得以前常说:编译器从不会骗你lmao),开始有些浮躁,因为出现了数据规模越大,反而运行时间变小的情况,而又冷静分析,方得其要领。

算法过程

言简意赅,直接上我的算法过程(能力有限,如有不好的地方,望不吝赐教)
1.将所有物品按性价比排序(降序)——优先选择条件
2.依次搜寻,并对当前路径的可行性进行判断(按贪心算法求出当前路径的最大解,与当前可行解比较,若更小的话, 这条路径可以废了————剪枝)
3.重复2直到结束

关键函数

判断上界(用贪心法求)

int judge(int num,int tmp,int w)
{
   
	int k=0,i;
	//按贪心法求上界
	for(i=num;i<n;i++)
	{
   
		if(w>b[i].w)
		tmp=tmp+b[i].v,w=w-b[i].w;
		else if(w==0)
		break;
		else
		tmp=tmp+b[i].v*w,w=0;
	}
	//上界与当前可行解ans进行比较,若比当前还小,则剪枝
	if(tmp>ans)
	k=1;
	return k;
}

主递归函数

//tmp表示当前路径可行解  w表示当前剩余重量  now表示当前搜索位置 
//y表示出队元素个数(也就是此路径放入背包的物品数)n表示总的物品数(物品已排序)
void find(int tmp,int w,int now,int y)
{
   
	int i,k,w0,j,l;
	j=now+1;
	//若遍历完成,则讨论 
	if(now==n)
	{
   
		//若此路径下求出的可行解大于当前最优解,则交换
		if(ans<tmp)
		{
   
			ans=tmp;
			memset(u, 0, sizeof(u));
			//解向量赋值
			for(i=0;i<y;i++)
			{
   
				u[a[i]]=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值