#include <bits/stdc++.h>
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<int,int>& 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<int, int> m;
dfs(0, 0,INT_MAX, INT_MIN, m);
cout << ans << endl;
return 0;
}
注意到“3种”,可以用map来存储,判断m.size()种类 >=3 ,
还有回溯时为零的数erase删除
-
id
:当前处理到第几道题。 -
sum
:当前已选题的难度总和。 -
minv
和maxv
:当前选题中的最小和最大难度。 -
m
:统计当前选择中不同难度题目的个数。
如果当前组合符合所有条件,就把答案加 1。