题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1231
小型状压DP;
f[i][j] 表示状态为 j ,最后一个奶牛是 i 的方案数;
所以下一个只能是和它相差大于 k 而且不在状态中的奶牛。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; typedef long long ll; int n,m,s[20]; ll ans,f[20][1<<16]; int abss(int x){return (x>0)?x:-x;} int main() { scanf("%d%d",&n,&m); int mx=(1<<n); for(int i=1;i<=n;i++) { scanf("%d",&s[i]); f[i][1<<(i-1)]=1; } for(int i=0;i<mx;i++) for(int j=1;j<=n;j++) { if(!((1<<(j-1))&i))continue; for(int k=1;k<=n;k++) { if((1<<(k-1))&i)continue; if(abss(s[k]-s[j])>m)f[k][i|(1<<(k-1))]+=f[j][i]; } } for(int i=1;i<=n;i++)ans+=f[i][mx-1]; printf("%lld ",ans); return 0; }