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

版权声明:本文为weixin_45885232原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。