深度搜索

2020-03-03  本文已影响0人  km15

给定一个序列,枚举这个序列的所有子序列,
目的:从中选择一个最优子序列,使它某个特征是所有子序列中国你最优的,如果有需要,还可以保存
这个问题也等价于,枚举从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);
}
上一篇 下一篇

猜你喜欢

热点阅读