1<=n,k,m<=21
输入格式:
n k m
/*
萌樱花的后院有n个树坑,所有树坑排列在一行上,每一个树坑都可以种一棵树,相邻树坑间的距离为1,现在所有的树坑都是空着的。
作为一只单身狗,他决定种上至少k棵树来保护环境。
为了让树苗宝宝健康快乐地生长,他要求任意两棵树之间的距离至少为m,请问这样种树的方案数是多少?
1<=n,k,m<=21
输入格式:
n k m
输出种树的方案数
3 2 2
1
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int a[100];
int main()
{
int n,m,k;
while(~scanf("%d%d%d",&n,&k,&m))
{
int ans=0;
for(int i=0; i<(1<<n); ++i)
{
int cnt=0;
memset(a,0,sizeof(a));
int num=i;
while(num!=0)
{
a[cnt++]=num%2;
num=num/2;
}
int count=0;
num=1;
bool f=true;
for(int j=0; j<cnt; ++j)
{
if(a[j]==1)
{
if(num<m&&j!=0)
f=false;
count++;
num=1;
}
else
num++;
}
if(f&&count>=k)
ans++;
}
printf("%d\n",ans);
}
return 0;
}
原文:http://www.cnblogs.com/jxust-jiege666/p/6475703.html