选题(dfs)

选题(dfs)_第1张图片

#include 
using namespace std;

int n, l, r, x;
int a[20];
int ans = 0;

void dfs(int id,int sum,int minv,int maxv,map& m) {
    if (m.size() >= 3 && sum >= l && sum <= r && maxv - minv >= x) ans++;

    for (int i = id; i < n; ++i) {
        m[a[i]]++;
        dfs(i + 1,sum + a[i],min(minv, a[i]),max(maxv, a[i]),m);
        m[a[i]]--; // 回溯
        if (m[a[i]] == 0) m.erase(a[i]); // 清除 0 值键
    }
}

int main() {
    cin >> n >> l >> r >> x;
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    map m;
    dfs(0, 0,INT_MAX, INT_MIN, m);
    cout << ans << endl;
    return 0;
}

 

注意到“3种”,可以用map来存储,判断m.size()种类 >=3 ,

还有回溯时为零的数erase删除

  • id:当前处理到第几道题。

  • sum:当前已选题的难度总和。

  • minvmaxv:当前选题中的最小和最大难度。

  • m:统计当前选择中不同难度题目的个数。

如果当前组合符合所有条件,就把答案加 1。

你可能感兴趣的:(深度优先,算法,c++)