题目描述
椎名真白每天的午饭一直是各种各样的年轮面包。
她掏出了
n
n个年轮面包,第
i
i个年轮面包含有的热量为
w
i
w
i
。她可以选择吃掉其中一些,获得热量之和。
虽然椎名真白平时埋头画画对生活细节很不上心,但是对于自己的外貌身材还是十分在意的,她不想变得太胖或者太瘦,所以选择了一个热量获得区间
[
l
,
r
]
[l,r],每天中午从年轮面包获得热量必须在该区间内。
显然有多种选择方案能够满足条件,但是真白是个数学白痴,她想让你帮忙计算一下所有方案数。
输入格式
第一行输入
3
3个正整数
n
,
l
,
r
(
n
≤
40
,
1
≤
l
≤
r
≤
300
)
n,l,r(n≤40,1≤l≤r≤300)。
第二行输入
n
n个正整数,表示每份年轮面包含有的热量
w
i
(
20
≤
w
i
≤
100
)
w
i
(20≤w
i
≤100)。
输出格式
一行一个整数,表示所有方案数。
样例
Input 1
4 70 85
80 75 90 70
Output 1
3
样例解释
对于样例输入,有以下
3
3种方案:
只吃第
1
1个面包
只吃第
2
2个面包
吃第
4
4个面包
每一种方案的热量之和都在
70
70到
85
85的范围内。
数据范围
n
≤
40
,
1
≤
l
≤
r
≤
300
,
20
≤
w
i
≤
100
n≤40,1≤l≤r≤300,20≤w
i
≤100
WA10代码:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
I AK IOI;
int n,l,r,a[45],ans;
void dfs(int sum,int now){
if(sum>r)return;
if(sum>=l)ans++;
if(now==n)return;
for(int j=now+1;j<=n;j++)dfs(sum+a[j],now+1);
}
int main(){
cin>>n>>l>>r;
for(int i=1;i<=n;i++)cin>>a[i];
sort(&a[1],&a[n+1],greater<int> ());
dfs(0,0);
cout<<ans;
i_ak ioi;
}