一个排列组合的算法问题,答出就给分
要求1-49,这49个数组合。
10个数为一组。
同组不可有重复的数。就是说,不可以1,2,3,4,5,6,7,8,9,9.
任意两组数要求至少有三个数不同。
排出所有数组。
问题点数:100、回复次数:10Top
1 楼thisisll(学习王高李,有个好身体)回复于 2006-07-04 17:33:03 得分 10
如果没有这句话
任意两组数要求至少有三个数不同。
10个循环
然后最里面的一个一个的换
现在有这句话了
10个循环
最里面3个for一起换
for(1->49)
for(1->49)
for(1->49)
...碰到重复的跳过
for(1->49)
for(1->49)
for(1->49)这3个平行的Top
2 楼jxegong()回复于 2006-07-04 18:05:01 得分 10
这题目很有趣,想了很久没想出好办法来,做个标记先,慢慢想。
一楼的思路我不是很清楚,但我感觉不是个好办法。
即使用个十位的栈,并保证从栈底到栈顶数字由小到大排列的话,穷举所需的循环次数也只是
10个for循环的1/(10!)Top
3 楼jxegong()回复于 2006-07-04 18:29:55 得分 0
另外我觉得这个题目还有个这样的问题,那就是结果并不唯一。比如先选定第一组数{1,2,3,4,5,6,7,8,9,10},那么第二组数该如何选。显然选{1,2,3,4,5,6,7,11,12,13}和选{1,2,3,4,5,6,7,11,12,14}将会导致最后得到的数组集合不同。甚至第二组数不同的两个选择将可能导致最后得到的两个集合的个数可能也不同。
晕了。Top
4 楼tfe(tfe)回复于 2006-07-05 15:06:21 得分 0
我用vb跑一楼的程序已经跑死机了。而且我的循环是这样的
for(49->1)
for(48->1)
for(47->1)
Top
5 楼livedeal(怀念)回复于 2006-07-05 17:18:49 得分 0
呵呵`~`Top
6 楼laiyiling(陌生人[MVP])回复于 2006-07-06 13:29:43 得分 10
参考上面的算法,这个算法需要你根据上面的两个附加条件,列举判断
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=186476Top
7 楼yzhg_cgl(Little Fish)回复于 2006-08-02 16:31:32 得分 10
3 7
C * C
49 46
到于怎么实现,请参考我在C里发表的相关回复.
Top
8 楼wj8215()回复于 2006-08-03 15:27:07 得分 0
用10个for按从小到大写出全部的组合,其中把倒数第三个数进行一个3的跳变,每次运行到最后就跳到倒数第三个数那里加3,然后再循环,这样就可以得到了!!!
我用JAVA写了这个小程序,不知道楼主要不要代码呢?Top
9 楼wj8215()回复于 2006-08-03 15:45:10 得分 0
不好意思,还想漏了一点东西Top
10 楼wj8215()回复于 2006-08-04 09:38:23 得分 60
用10个for按从小到大写出全部的组合,其中把倒数第三个数进行一个3的跳变,也就是做一个3个数的移位,当最后一个数是49时,跳到顺数第五个数,让这个数也做3的跳变,当第七个数是46时,跳到第一位,让第一位做一个4的跳变,这样做应该就可以了。组合数是408
下面是我用JAVA做的程序,可以参考一下:
double y=1;
Loop3:for(int a=1; a<=49; a=a+4){
for(int b=2; b<=49; b++){
if(b>a){
for(int c=3; c<=49; c++){
if(c>b){
for(int d=4; d<=49; d++){
if(d>c){
Loop2:for(int e=5; e<=49; e=e+3){
if(e>d){
for(int f=6; f<=49; f++){
if(f>e){
for(int g=7; g<=49; g++){
if(g>f){
Loop1:for(int h=8; h<=49; h=h+3){
if(h>g){
for(int i=9; i<=49; i++){
if(i>h){
for(int j=10; j<=49; j++){
if(j>i){
System.out.println(a+", "+b+", "+c+", "+d+", "+e+", "+f+", "+g+", "+h+", "+i+", "+j+": "+y);
y++;
if(g==46) continue Loop3;
if(j==49) continue Loop2;
continue Loop1;
Top




