给定一个序列,枚举这个序列的所有子序列,
目的:从中选择一个最优子序列,使它某个特征是所有子序列中国你最优的,如果有需要,还可以保存
这个问题也等价于,枚举从N个整数中选择K个数的所有方案
//序列A中n个数选k个数使得和为x,最大平方和为maxSumSqu
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 maxSumSqu) {
if (nowK == k && sum = x) { //找到k个数的和为x
if (sumSqu > maxSumSqu) { //如果找到比当前更优的
maxSumSqu = sumSqu; //更新最大平方和
ans = temp; //更新最优方案
}
return;
}
//已经处理完n个数,或者超过k个数,或者和超过x,返回
id(index == n || nowK > k || sum > x) return;
//选index号数
temp.push_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, maxSumSqu);
}
网友评论