dfs做法,不用回溯,如果回溯了会造成结果重复
#include<iostream>
using namespace std;
const int N = 20;
int a[N],ans=0,l,r,n,x;
//从左到右参数分别表示,选了几个数,第k个数从u开始选,总和,最大值,最小值
void dfs(int k,int u,int sum,int maxv,int minv)
{
if(sum>r) return;//剪枝
if(k>=2)
{
if(sum>=l&&maxv-minv>=x) ans++;//看看满不满足要求
}
//类似于求组合数
for(int i=u;i<=n;i++)
{
dfs(k+1,i+1,sum+a[i],max(maxv,a[i]),min(minv,a[i]));
}
}
int main()
{
cin>>n>>l>>r>>x;
for(int i=1;i<=n;i++) cin>>a[i];
//方便给maxv和minv赋值,所以将一层循环放外面,放里面也是可以的
for(int i=1;i<=n;i++)
{
dfs(1,i+1,a[i],a[i],a[i]);
}
cout<<ans<<endl;
return 0;
}
二进制做法
#include <bits/stdc++.h>
#define ll long long
#define x first
#define y second
#define INF 0x7f7f7f7f
using namespace std;
typedef pair<int,int> PII;
const int N=15+10;
int n,m,ans;
int vis[N];
int a[N];
int l,r,x;
bool check(int s) {
int sum=0,minv=INF,maxv=-INF;
int cnt=0;
for(int i=0; i<n; i++) {
if(s>>i&1) {
cnt++;
sum+=a[i];
if(a[i]<minv)minv=a[i];
if(a[i]>maxv)maxv=a[i];
}
}
if(cnt>=2&&sum>=l&&sum<=r&&(maxv-minv)>=x)return true;
return false;
}
int main() {
cin>>n>>l>>r>>x;
for(int i=0; i<n; i++)cin>>a[i];
for(int i=0; i<1<<n; i++) {
if(check(i)) {
ans++;
}
}
cout<<ans;
return 0;
}