主要用到公式 (表示m个数里存在1的个数最多n的组合数)
而这个公式的实现过程是递归,遇到n==0||m==0返回1后回归,有值时也返回值后回归
思路就是,先看左边第1位(不存在1时)的组合数是否小于di,若小于则说明左边第1位存在1…^
View Code
#include<stdio.h>
unsigned int dp[33][33];
unsigned swap(int a,int b)
{
if(a==0||b==0)return 1;
if(dp[a][b]!=0)return dp[a][b];
return dp[a][b]=swap(a-1,b-1)+swap(a,b-1);
}
int main()
{
int n,cun,di;
while(scanf("%d%d%d",&n,&cun,&di)!=EOF)
{
int i;
for(i=n;i>=1;i--)
{
if(cun!=0&&(swap(cun,i-1)<di))
{
printf("1");
di-=swap(cun,i-1);
cun--;
}
else
{
printf("0");
}
}
printf("\n");
}
}