n=15,L,R,X
给你n个背包,每个带有一个价值
要求你选一定数量的背包, 使得总价值sum>=L && sum<=R
并且单个背包最大价值maxx-最小价值minn >= X;
n太小,直接用 数的二进制表示每个背包的选择状态,最多就2^15
对每个状态判断一下是否合法即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define inf 1e9+1
__int64 tm[20];
int main()
{
__int64 i;
__int64 n,l,r,x;
scanf("%I64d%I64d%I64d%I64d",&n,&l,&r,&x);
for (i=1;i<=n;i++)
scanf("%I64d",&tm[i]);
__int64 cun=(__int64)pow(2.0,n)-1;
__int64 ans=0;
for (i=1;i<=cun;i++)
{
__int64 sum=0;
__int64 minn=inf;
__int64 maxx=0;
__int64 tmp=i;
__int64 cou=1;
while(tmp)
{
if (tmp&1)
{
sum+=tm[cou];
if (tm[cou]>maxx)
maxx=tm[cou];
if (tm[cou]<minn)
minn=tm[cou];
}
tmp>>=1;
cou++;
}
if (sum>=l&&sum<=r )
if (maxx-minn>=x)
ans++;
}
printf("%I64d\n",ans);
return 0;
}