HPU6002 问题——回溯【入门题】

版权声明:那个,最起码帮我加点人气吧,署个名总行吧 https://blog.csdn.net/qq_41670466/article/details/82386941

最近我一直在刷dfs的题,所以写这方面的基础题可能较多,可以看我的搜索分类的文章一起学习

题目原链接:http://net.hpuacm.cf/problem/6002

思路解释:读题后发现对于问题的求解可以让计算机一个一个的枚举所以可能且总共只要10个数所以就想到使用深搜的方式来处理这道题目;这也是我刚刚得出的感悟,凡是一个问题的处理可以通过暴力枚举的方式那也就意味着可以使用深搜来处理,当然还要考虑时间复杂度;

代码:

#include<bits/stdc++.h>

using namespace std;

int num[15];
int ans = 0;
int n, l, r, x;

void dfs(int sum, int p,int mn,int cnt)
{
	if (cnt >= 2 && sum >= l && sum <= r && num[p - 1] - mn >= x)
		ans++;
	for (int i = p; i <= n; i++)
	{
		if (sum + num[i] > r) return;
		if (sum + num[i] <= r)
		{
			dfs(sum + num[i], i + 1,mn,cnt + 1);
		}
	}
}

int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		ans = 0;
		scanf("%d %d %d %d", &n, &l, &r, &x);
		for (int i = 1; i <= n; i++)
			scanf("%d", &num[i]);
		sort(num + 1, num + 1 + n);
		for (int i = 1; i <= n; i++)
			dfs(num[i], i + 1, num[i], 1);
		cout << ans << endl;
	}
	//system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/82386941
今日推荐