DFS解决序列所有子列的问题

题目描述:有N个数从中选择K个数使和等于X且获得最大的平方和


思路:
首先用一个index作为数组的下标,判断当前节点是不是要加入进下一步的计算,如果要加入到到下一步的计算,那么对于的和sum和对应的最大平方和maxpow都要改变,已经加入的K的个数会发生改变;如果不加入下一步的计算,那么index继续向下移动,已经计算的K的个数不再统计。
当index已经移动到数组的尾部,或者当前已经有K个数被加入到答案的序列中,或者序列中数字的和已经等于要求的X,那么就直接返回,程序结束;
如果当前已经是第K个数,且序列中的和已经等于要求的X,那么看他们的平方和的大小,取最大平方和的作为答案。
每次在递归之前,将要递归的值加入到临时序列之中,如果不递归这个值,就不加入到序列,经过上面的操作之后,临时的序列中已经存放了最优的序列值,直接返回最优序列值即可。

const int maxn = 10010;
vector<int> temp, ans;		//存放计算的临时量和最终的结果序列
int n, k, x, maxpow=-1;		//有N个数从中选择K个数使和等于X且获得最大的平方和 
int A[maxn];
void DFS(int index, int nowk, int nowsum, int nowpow)
{
	if(nowk == k && nowsum == x)
	{
		if(nowpow > maxpow)	//选择平方和更大的那个 
		{
			maxpow = nowpow;
			ans = temp;		//更新最终序列 
		}
		return;
	}
	if(index == n || nowk>k || nowsum == x) return;	
	temp.push_back(A[index]);//递归这条 
	DFS(index+1, nowk+1, nowsum+A[index], nowpow+pow(A[index],x));
	temp.pop_back();		//不递归 
	DFS(index+1, nowk, nowsum, nowpow);
} 
int
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DFS(深度优先搜索)是一种用于解决八数码问题算法。八数码问题是指盘面上有3x3共9个格子,有8个格子上有数字1至8,还有一个空白格子,通过移动数字将它们按照特定顺序排列。 DFS解决八数码问题的基本思想是,从初始状态开始,按照特定的规则进行搜索,直到找到目标状态。 具体步骤是,首先将初始状态放入一个待搜索的队列中。然后从队列中取出状态,判断是否为目标状态。如果是目标状态,则搜索结束,返回结果。如果不是目标状态,将该状态的所有后继状态放入队列中,继续搜索。这里“后继状态”是指通过移动空白格子将数字移到相邻的格子形成的新状态。 在DFS中,采用递归的方式进行搜索,即先遍历一个分支,直到不能继续搜索,然后回溯到上一个状态,继续搜索其他分支。因为八数码问题的状态数很大,存在许多可能的状态,所以DFS可能会遇到很多无效状态,浪费时间和空间。 为了提高效率,可以使用一种优化的方法,即启发式搜索。启发式搜索根据某种评估函数(通常是估计目标状态与当前状态之间的距离)来选择下一个搜索的状态。这样可以尽快接近目标状态,减少不必要的搜索。 综上所述,DFS是一种解决八数码问题的有效算法。通过深度优先的搜索方式,可以遍历所有可能的状态,找到目标状态。同时结合启发式搜索,可以提高搜索效率,减少不必要的搜索步骤,更快地找到解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值