dfs的优化详细课(保姆级详细教程,保证让你以后的dfs多获得很多分)(hjyowl精讲)

众所周知,dfs是一个非常通俗易懂的算法,并且非常的简单,好学。不过dfs这个算法存在着一些缺点,例如说会超时,今天,教大家几个卡常技巧,可以让你在考试是写的dfs多拿一点分。

我们先来看一个简单的问题,如下:

有n种物质,第i种物质是有a[i]个a元素和b[i]个b元素,并且卖出c[i]元,我需要一个比例恰好为a1:b1的元素,而且我希望花的钱尽可能少。

这是数据范围:

n<=40

a和b的值<10,c的值<100,a1和b1<=10,而且所有数字都是整数。

好了,很多同学看到这个数据范围(n<=40)就慌了,因为我暴力枚举每一个选不选是2^40的时间复杂度,一般来讲,你跑到2^27以上就危险了,所以说我们要想办法优化一下。

这个东西,我们用的方法叫做最值剪枝(我自己发明的一个名字),我们先看一下暴力的正常做法:

#include <bits/stdc++.h>
using namespace std;
const int N = 50;
int n,m,k;
struct owl{
	int a,b,c;
}x[N];
int res = 0x3f3f3f3f;
void dfs(int u,int owl1,int owl2,int s){
	if (u == n){
		if (owl1 * k == owl2 * m && owl1 != 0 && owl2 != 0){
			res = min(res,s);
		}
		return ;
	}
	if (owl1 * k == owl2 * m && owl1 != 0 && owl2 != 0){
		res = min(res,s);
		return ;
	}
	dfs(u + 1,owl1,owl2,s);
	dfs(u + 1,owl1 + x[u].a,owl2 + x[u].b,s + x[u].c);
}
int main() {
	ios::sync_with_stdio(false);
	
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值