同我在洛谷的博客
洛谷题目传送门
与这道题相近的题目是:洛谷P2036 [COCI2008-2009#2] PERKET
(大家可以看一下这道题)
题目大概就是:给定 n n n 个数,从中选出一些数,保证这些数之和在 [ l , r ] [l,r] [l,r]的范围里,并且最大数和最小数的差大于等于 x x x 。
思路:
一上来,就想到了二进制枚举。
(枚举每个数的“选”和“不选”)
再加上 1 ≤ n ≤ 15 1 \le n \le 15 1≤n≤15 的数据范围,( 2 15 ≈ 30000 2^{15} \approx 30000 215≈30000)这道题就用枚举 + + + dfs 。
A C AC AC代码:
#include<iostream>
using namespace std;
int c[20];
int ans;
int n,l,r,x;
void dfs(int k/*已做过选择的数量(不一定选中)*/,int dif/*难度和*/,int minn/*最小难度*/,int maxn/*最大难度*/,int cnt/*已选中的课程数量*/){if(k==n){if(dif>=l&&dif<=r&&maxn-minn>=x&&cnt!=0){//判断该选课是否合法 ans++;}return;}dfs(k+1,dif+c[k+1],min(minn,c[k+1]),max(maxn,c[k+1]),cnt+1);//选 dfs(k+1,dif,minn,maxn,cnt);//不选
}
int main(){scanf("%d%d%d%d",&n,&l,&r,&x);for(int i=1;i<=n;i++){scanf("%d",&c[i]);}dfs(0,0,1e6+1,0,0);cout<<ans;return 0;
}