状态压缩
/************************************************************** Problem: 1231 User: lxy8584099 Language: C++ Result: Accepted Time:164 ms Memory:9072 kb ****************************************************************/ /* 前面的状态不会影响后面 f i,j i表示当前有哪些牛 最后一头牛是j 枚举i 枚举j 枚举k k满足可以凑再j后面 f[i|k,k]+=f[i,j] 乱搞一波。。。 65536 */ #include<cstdio> #define ll long long using namespace std; const int N=66000; ll f[N][16],res; int n,m,a[16]; inline int abs(int x) {return x>0?x:-x;} int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) f[1<<i][i]=1; for(int i=0;i<(1<<n);i++) for(int j=0;j<n;j++) if(i&(1<<j)) for(int k=0;k<n;k++) { if(abs(a[k]-a[j])<=m) continue; if((1<<k)&i) continue; f[i|(1<<k)][k]+=f[i][j]; } for(int i=0;i<n;i++) res+=f[(1<<n)-1][i]; printf("%lld\n",res); return 0; }