只写DFS函数部分,主函数大家可以自行补全。
int n,k,x,maxSumSqu = -1,A[maxn];
//temp存放临时方案,ans存放平方和最大的方案
vector<int> temp,ans;
//当前处理index号整数,当前已选整数个数为nowK
//当前已选整数之和为sum,当前已选整数平方和为sumSqu
void DFS(int index,int nowK,int sum,int sumSqu){
if(nowK == k && sum == x){//找到k个数的和为x
if(sumSqu > maxSumSqu){//如果找到比当前更优的
maxSumSqu = sumSqu;//更新最大平方和
ans = temp;//更新最优方案
}
return;
}
}
//已经处理完n个数,或者超过k个数,或者和超过x,fanhui
if(index == n || nowK > k || sum > x) return;
//选index号数
temp.pish_back(A[index]);
DFS(index + 1,nowK + 1,sum + A[index],sumSqu + A[index]*A[index]);
temp.pop_back();
//不选index号数
DFS(index + 1, nowK,sum,sumSqu);
}