题目描述:
Maoge有N个砖块 (2<=N<=1000), 他想要把这些砖块搭成一个塔。如果他把砖块A放在B上面,A的长度必须小于等于B的长度减去D (1<=D<=n)。请找出一共有有多少种方法,然后输出答案 mod 10^9+7。
塔的高度不能为零。
输入格式:
第一行两个整数N和D。
第二行N个整数,代表砖块的长度。
输出格式:
答案 modulo 10^9+7.
样例输入:
4 1
1 2 3 100
样例输出:
15
#include<bits/stdc++.h>
using namespace std;
int n,a[1005],vis[1005],d,ans=0;
const int N=1e9+7;
void dfs(int x,int y,int step){// x是最顶层砖块的长度,y是层数,step是当前层数
if(step==y){//当前层数=y,ans+1
ans++;
ans%=N;
return ;
}
for(int i=1;i<=n;i++){ //枚举下一层
if(vis[i]==0){
if(a[i]>x-d) break;//剪枝 (当目前砖块不满足条件,那么之后的砖块都不符合条件,直接结束)
vis[i]=1;//标记
dfs(a[i],y,step+1);
vis[i]=0;//撤销标记
}
}
ans++;
}
int main(){
cin>>n>>d;
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(vis,0,sizeof(vis));
sort(a+1,a+n+1);//a数组从小到大排序
for(int i=1;i<=n;i++){//枚举层数
for(int j=n;j>=1;j--){//从大到小枚举最底层的砖块
vis[j]=1;//标记最顶层砖块
dfs(a[j],i,1);//搜索
}
}
cout<<ans;
return 0;
}