解题思路:
注意事项:
参考代码:
//买票找钱问题,
/*思路:
将所有的排列找出,然后找出符合条件的组数
核心思路:
使用递归,将所有小盆友的可能排列顺序找出(难点)
全排列问题
代码如下 */
#include<stdio.h>
int state=0; //判断该排列是否符合
int num=0; //计数符合的组合数
int ticket[100];
int y; //小盆友的总数
void swap(int k,int i) //交换位置
{
int temp=ticket[k];
ticket[k]=ticket[i];
ticket[i]=temp;
}
void cheak(void) //检查该排列是否符合条件
{
for(int i=0;i<y;i++) //两元减一,一元加一
{
if(ticket[i]==2)
state--;
else
state++;
if(state<0)
break;
}
if(state>=0)
num++;
state=0;
}
void perm(int k){ //递归检索每一种排列可能
if(k==y) //结束条件
{
cheak(); //每一种排列检查一次
}
else{
for (int i=k;i<y;i++){
swap(k,i); //交换
perm(k+1); //进行下一维度的排列
swap(k,i); //将值换回,保证不重复且数据不变
}
}
}
int main()
{
int m,n;
scanf("%d%d%d",&y,&m,&n);
if(m<n)
printf ("0");
else{
for (int i=0;i<y;i++) //将小盆友的零钱值赋给数组
{
if(i<m)
ticket[i]=1;
else
ticket[i]=2;
}
perm(0); //入口,开始递归检索
printf("%d",num);
}
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复