給定一個(gè)序列岳悟,枚舉這個(gè)序列的所有子序列,
目的:從中選擇一個(gè)最優(yōu)子序列泼差,使它某個(gè)特征是所有子序列中國(guó)你最優(yōu)的贵少,如果有需要,還可以保存
這個(gè)問(wèn)題也等價(jià)于堆缘,枚舉從N個(gè)整數(shù)中選擇K個(gè)數(shù)的所有方案
//序列A中n個(gè)數(shù)選k個(gè)數(shù)使得和為x滔灶,最大平方和為maxSumSqu
int n, k, x, maxSumSqu = -1, A[maxn];
//temp存放臨時(shí)方案,ans存放平方和最大方案
vector <int> temp, ans;
//當(dāng)前處理index號(hào)整數(shù)吼肥,當(dāng)前已選整數(shù)個(gè)數(shù)為nowK
//當(dāng)前已選整數(shù)之和為sum录平,當(dāng)前已選整數(shù)平方和為sumSqu
void DFS(int index, int nowK, int sum, int maxSumSqu) {
if (nowK == k && sum = x) { //找到k個(gè)數(shù)的和為x
if (sumSqu > maxSumSqu) { //如果找到比當(dāng)前更優(yōu)的
maxSumSqu = sumSqu; //更新最大平方和
ans = temp; //更新最優(yōu)方案
}
return;
}
//已經(jīng)處理完n個(gè)數(shù),或者超過(guò)k個(gè)數(shù)缀皱,或者和超過(guò)x斗这,返回
id(index == n || nowK > k || sum > x) return;
//選index號(hào)數(shù)
temp.push_back(A[index]);
DFS(index + 1, nowK + 1, sum + A[index], sumSqu + A[index] * A[index]);
temp.pop_back();
//不選index號(hào)數(shù)
DFS(index + 1, nowK, sum, maxSumSqu);
}