题目
dp[i][S]:选取状态S以i为结尾的方案数。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=17;
int a[N];ll dp[1<<N][N];
int main(){
int n,K,t;scanf("%d%d",&n,&K),t=1<<n;
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i) dp[1<<(i-1)][i]=1;
for(int i=1;i<t;++i){
for(int j=1;j<=n;++j){
if(!(i&(1<<(j-1)))) continue;
for(int k=1;k<=n;++k){
if(i&(1<<(k-1))) continue;
if(abs(a[j]-a[k])>K) dp[i|(1<<(k-1))][k]+=dp[i][j];
}
}
}
ll ans=0;
for(int i=1;i<=n;++i) ans+=dp[t-1][i];
printf("%lld\n",ans);
}