poj 3187

#include<stdio.h>
#include<stdlib.h>
int s[11],N,M,vis[11];
int num[11][11];
void dfs(int co)
{
         int i,j;

         if(co==N+1)
          {
                   for(i=0;i<N;i++)        //初始第一行
                   {
                            num[1][i]=s[i+1];
                        //  printf("%d ",num[1][i]);
                   }
                  for(i=2;i<=N;i++)        //然后按照每一层的数等于上一层临近2个数的和,来计算每一层的数
                      for(j=0;j<=N-i;j++)
                      {
                             num[i][j]=num[i-1][j]+num[i-1][j+1];
                      }
                  if(num[N][0]==M)      //num[N][0]就是最后一行唯一数
                  {
                            for(i=1;i<=N;i++)
                                 printf("%d ",s[i]);
                            printf("\n");
                            exit(0) ;          //直接结束进程!不要用return ,这会继续递归排列,直到完成,会超时, 
                 }
 }
 for(i=1;i<=N;i++)        //全排列
 {
  
                if(!vis[i])
                {
                        s[co]=i;
                        vis[i]=1;     //vis[i]用来标记i是否用过
                        dfs(co+1);
                        vis[i]=0;
                }
 }
 return ;
}
int main(void)
{
           memset(vis,0,sizeof(vis));
           scanf("%d%d",&N,&M);
           dfs(1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值