题目描述:有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