c语言 跪求:输入M个数从中取N个数进行组合并输出所有组合项

M、N都是不固定的,例如输入M可以是3、5、9、24也可以是8、4、7、21、6、11,N可以是2也可以是5,当然N<M.(注:要C语言源码,本人只学了C,而且M、N值可以随时输入的)本人在百度搜了一整天也没想要的答案,哪位大侠懂得请帮帮忙,灌水勿犹,谢谢~!
不是随机取,是手动输入,例如,手动输入4个数:3、5、9、24取其中2个数进行组合,如3-5 3-9 3-24 5-9等等输出所有组合项;又如手动输入6个数4、7、9、12、1、2取其中3个数进行组合,如4-7-9 4-7-12等等输出所有组合项。输入的数与个数不定

典型的组合问题,解法有递归、回溯等等
递归法较简单,代码如下:

void combine(int a[], int n, int m, int b[], int M);

参数:
a 存放候选数字
n 总项数
m 取出项数
b 存放选出结果
M = m

#include "stdio.h"
#define MAX 100

void combine(int a[], int n, int m, int b[], int M);

int main(void)
{
int i;
int a[MAX], b[MAX];

for (i = 1; i < 100; i++)
a[i - 1] = i;

combine(a, 5, 4, b, 4);
}

void combine(int a[], int n, int m, int b[], int M)
{
int i, j;

for (i = n; i >= m; i--)
{
b[m - 1] = i - 1;
if (m > 1)
combine(a, i - 1, m - 1, b, M);
else
{
for (j = M - 1; j >= 0; j--)
printf("%d ", a[b[j]]);
printf("\n");
}
}
}

其他方法可查阅相关资料。追问

源码运行结果:
5 4 3 2
5 4 3 1
5 4 2 1
5 3 2 1
4 3 2 1
请按任意键继续. . .
虽然也是输出组合,可是输入的数不一定是1、2、3、4、5,取出的数也不一定是4个啊!不过还是谢谢你!我要个具有普遍性、实用性的,而不是仅仅对1 2 3 4 5进行组合

追答

源码里数组a是从1到100,你可以根据自己的需要传入其他的数组啊。

追问

是可以输入其它数据,可是你这段源码每次都是从1开始到最大数,如N为20,就从1到20间所数的组合,可我手动输入的数不一定含有1和3啊

追答

可以没有啊,你给定任意数组都行,3 5 9 24 8 4 7 21 6 11 48 38 3 3 494 都没问题的

追问

高手从哪定任意数组输入3 5 9 24 8 4 7 21 6 11 这些数啊,是把这些数定给数组A吗,具体点,拜托!!!!!

追答

注意main函数里不是有combine(a, 5, 4, b, 4);的函数调用吗,传入的数组a是可以自定的,可以调用scanf让它接收键盘的输入。

追问

我改成这样,其它没改,可还是没运行出想要的结果,请高人看看哪错了,修改下!!


温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-13
因为是手动输入,你就将程序简化为:输入几个数,如2,8,10,然后输出所有组合。然后给简化部分增加判断的部分,判断手动输入的那几个数是不是在第一次输入的数里边,并作出错处理!这样就简单多了
第2个回答  2012-10-13
抱歉 我帮你想了一个循环的算法 但是由于你要的是手动输入提取数的个数 由于事先无法确定循环的层数 所以我搞不定 实在抱歉 但是如果N是确定话 那么就可以解决了 就是多加几层循环嵌套而已
没能帮到你 真的很遗憾
第3个回答  2012-10-13
请搜索一下“C语言动态数组”或“C语言动态内存分配”

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网