正文

排队买票2007-06-05 22:51:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/26439.html

分享到:

问题描述 有M个小孩到公园玩,门票是1元。其中N个小孩带的钱为1元,K个小孩带的钱为2元。售票员没有零钱,问 这些小孩共有多少种排队方法,使得售票员总能找得开零钱。注意:两个拿一元零钱的小孩,他们的位置 互换,也算是一种新的排法。(M<=10) 输入 输入一行,M,N,K(其中M=N+K,M<=10). 输出 输出一行,总的排队方案。 输入样例 4 2 2 输出样例 8 /*********************************************** 题目可能不是很难,和排列组合有关,我的数学不是 很好但这题能想到解法,不过却想了很久不知道怎么 表达这个解法,开始用想用普通数组通过递归求解。 没解决,最后终于想到了二叉树,呵呵,总算解决了 不过遗憾,开始没考虑特殊数据 1 1 0 ,WA了一次 题目 M<=10,以下程序不受此限制。   --- 2007--6--5 --- ***********************************************/ #include <stdio.h>#include <malloc.h> typedef struct tree{ int i,dibs; struct tree *left,*right,*parent;}TREE; TREE* GetTreeNode(void){ TREE *temp; temp = (TREE*)malloc(sizeof(TREE)); temp->dibs = temp->i = 0; temp->left = temp->right = temp->parent = NULL; return temp;} void CreateTree(int n, int k, TREE **p){ TREE *temp; if(n==0 && k==0)  return ; if(n >= 1){  temp = GetTreeNode();  temp->dibs = ((*p)->dibs)+1;  temp->i = n;  temp->parent = *p;  (*p)->left = temp;  CreateTree(n-1,k,&temp); }   if(k >= 1 && (*p)->dibs >= 1){  temp = GetTreeNode();  temp->dibs = ((*p)->dibs)-1;  temp->i = k;  temp->parent = *p;  (*p)->right = temp;  CreateTree(n,k-1,&temp); }} int main(){ int   m,n,k,sum,t,flag; TREE  *head,*temp; scanf("%d%d%d",&m, &n, &k); head = GetTreeNode(); head->dibs = 1; head->i = n; CreateTree(n-1, k, &head); if(m == 1 && n==1){  printf("1\n");  return 0; } for(sum=0, flag=t=1; head->parent!=NULL||head->left||head->right;){  head->i = t * head->i;  t = head->i;  if(head->left){   flag++;   temp = head->left;   head->left = NULL;   head = temp;  }  else if(head->right){   flag++;   temp = head->right;   head->right = NULL;   head = temp;  }  else {   temp = head;   head = head->parent;   free(temp);   if(flag == m)    sum += t;   t = 1;   flag--;  } } printf("%d\n",sum); return 0;}  

阅读(3451) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册