状压dp
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,m;
ll a[20];
ll f[20][1<<16];
int main()
{
scanf("%lld %lld",&n,&m);
for(ll i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
for(ll i=0;i<n;i++)
{
f[i][1<<i]=1;//以a[i]为开头
}
for(ll j=0;j<(1<<n);j++)
{
for(ll i=0;i<n;i++)
{
if(j&(1<<i))//a[i]要在这个集合里
{
for(ll k=0;k<n;k++)
{
if(!((1<<k)&j)&&abs(a[i]-a[k])>m)//a[k]不在这个集合里
{
f[k][j|(1<<k)]+=f[i][j];
}
}
}
}
}
ll ans=0;
for(ll i=0;i<n;i++)
{
ans+=f[i][(1<<n)-1];
}
printf("%lld",ans);
}
用01存的是第i个数有没有在里面,而不是这个数值。&判断是否在里面,在为1。| (或)用来添加。