组合数学——USACO3.2.2

主要用到公式 (表示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");
}
}
原文地址:https://www.cnblogs.com/huhuuu/p/1977584.html