暴难的考研题。

drmao 2003-10-28 01:19:33
我有一个考研的题目:
编写一个函数Permutation(int n,int r)输出从1到n的自然数中任取r个数的所有组合,例如n=3,k=3时要输出
123,132,213,231,321,312
...全文
136 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
tudou614 2003-12-21
  • 打赏
  • 举报
回复
FAINT
看来我太菜了,我CS可一点不菜,不行啊,赶紧去学习!!
祝各位考研顺利!!(我今年也报了,估计凉的可能性比较大!我是自动化专业的,报的是计算机!
感觉好难!!)
zalyer 2003-11-26
  • 打赏
  • 举报
回复
//虽然我高2,但是看了这样的题我也想考研了//

厉害!
clqwhm 2003-11-02
  • 打赏
  • 举报
回复
我晕
bipeng 2003-11-02
  • 打赏
  • 举报
回复
Too simple!
cafeeee 2003-11-02
  • 打赏
  • 举报
回复
太简单了!
v_salt 2003-10-31
  • 打赏
  • 举报
回复
虽然我高2,但是看了这样的题我也想考研了
dengsf 2003-10-31
  • 打赏
  • 举报
回复
我新来不久,大家以后多关照。

我发现你们的程序基本不写注释,像我这样的新手看得很辛苦。
如果细节很多的话,觉得会淹没掉主要的思想了。

pxwzd123 2003-10-30
  • 打赏
  • 举报
回复
回朔法结构:

do{
if(ok)
if(ok) 输出解;调整
else 扩展
else 调整
}while(1);
zzwu 2003-10-30
  • 打赏
  • 举报
回复
我认为可以分2个层次来考虑:先求组合,再求每个组合的全排列. 例如

设n=4,r=3,则n取r的组合为:

123,124,134,234

而n取r的排列只要将以上每个组合进行全排列就行了:

123全排列为: 123,132,213,231,312,321
124全排列为: 124,142,214,241,412,421
134全排列为: 134,143,314,341,413,431
234全排列为: 234,243,324,342,423,432

把2个工作综合一下,就可以得到所需结果。求组合和求全排列的方法就相对不难了。

zalyer 2003-10-30
  • 打赏
  • 举报
回复
up
kwest 2003-10-29
  • 打赏
  • 举报
回复
组合算法
dahan2005 2003-10-29
  • 打赏
  • 举报
回复
对初学者来说,的确很难,比方说我。
Sunsw 2003-10-29
  • 打赏
  • 举报
回复
我想楼主的意思是:这么“难”的考研题啊???!!!
大家不要误会。
ZhangYv 2003-10-29
  • 打赏
  • 举报
回复
谢谢提醒,写的时候错了一个地方,其它同:
void Com(int n, int m)
{
int i;
for (i = n; i >= m; --i){ //抽屉原理
B[m] = A[i];
if (m > 0)
Com(i-1,m-1); //不是Com(n-1,m-1)
else
Print();
}
}
zhouqingyuan 2003-10-28
  • 打赏
  • 举报
回复
回复人: ZhangYv(新手上路)

求组合的方法好象输出不正确啊,会有很多象533,422的东西啊,
SimonSui 2003-10-28
  • 打赏
  • 举报
回复
So easy,我高一就会做这种穷举了,号称k层,每层n-k+1个孩子的树。
FishCrazy 2003-10-28
  • 打赏
  • 举报
回复
如果这就是“暴难”的题。

我真希望自己今年能够遇上......
levinjoe 2003-10-28
  • 打赏
  • 举报
回复
没看懂,是输出组合还是排列啊!
permutaion:排列
combination:组合

具体都可用回溯解决;
排列:在扩展时保证不重复就可以了;
组合:在扩展时保证不重复,且递增就可以了!
ZhangYv 2003-10-28
  • 打赏
  • 举报
回复
楼主要求排列还是组合?
例如n=3,k=3时要输出123,132,213,231,321,312是P(3,3),如果要求C(3,3)就只有123.
求排列的http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=2987
ZhangYv 2003-10-28
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
const int MAXSIZE = 80;
int N,M;
int A[MAXSIZE], B[MAXSIZE];
void Print()
{
int i;
for (i = 0; i < M; ++i)
printf("%d ", B[i]);
printf("\n");
}

void Com(int n, int m)
{
int i;
for (i = n; i >= m; --i){ //抽屉原理
B[m] = A[i];
if (m > 0)
Com(n-1,m-1);
else
Print();
}
}
int main()
{
int i;
/* printf("%s", "Input N M = ");
scanf("%d%d", &N,&M);
*/
N = 5;
M=3;
if (N > MAXSIZE)
return 1; //越界
for (i = 0; i < N; ++i)
A[i] = i+1;
Com(N-1,M-1);
system("pause");
return 0;
}
加载更多回复(5)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧