刷题的路上 还差的很远呢。
一看就知道用DFS + 回溯
但就是写不出来代码 忧郁
最后还是看了别人的代码才有思路的。
诶
忧郁。
不知道题目链接 是给新生做的训练里看到的(丢人!)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n, l, r, x;
int num[15];
int temp[15];
int mr[15];
int result;
void dfs(int index,int req,int sum,int now){
if (sum > r){
return;
}
if (req == now && sum < l){
return;
}
if (sum >= l && sum <= r && req == now && (temp[now-1] - temp[0]) >= x){
result++;
return;
}
for (int i = index; i < n; i++){
if (!mr[i]){
mr[i] = 1;
temp[now] = num[i];
dfs(i + 1,req, sum + num[i], now + 1);
}
mr[i] = 0;
}
sum = 0; //如果运行到这一步,证明,由index开始,包含req个数的序列已经全部试过了,下一轮开始,要从另一个数字打头的开始尝试了,所以把sum初始化
}
int main(){
freopen("TestDate.txt", "r", stdin);
int i;
while (cin >> n >> l >> r >> x){
for (i = 0; i < n; i++){
cin >> num[i];
}
result = 0;
sort(num, num + n);
for (int k = 2; k <= n; k++){
memset(temp, 0, sizeof(temp));
memset(mr, 0, sizeof(mr));
dfs(0, k, 0, 0);
}
cout << result << endl;
}
return 0;
}