关于排列组合的问题

Chrissie 2009-05-21 10:23:07
假设有个n个数组,每个数组中又有若干个元素(各个数组所含元素个数不等),求从每个数组中取出一个数的组合算法。
...全文
79 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyh12345 2009-05-21
  • 打赏
  • 举报
回复
a1,b1,....x1
a1, b2,....x1
....
ax,bx.....xNm

直接一个n层循环就能输出
Chrissie 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goodhavens 的回复:]
每个数组必须要取出一个数吗? 就假设是。 你看下面这样是否是你要的:
数组1: Ar1{a1,a2,...,aN1}
数组2: Ar2{b1, b2,...bN2}
...
数组m: Arm(x1, x2,...xNm}

1. 随机下标
int RandIndex(int nMin, int nMax)
{
int RANGE_MIN = nMin;
int RANGE_MAX = nMax;
int nRet = (((double) rand() / (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
return nRet;
}
2. 依次随机取得各数组…
[/Quote]
我需要所有的组合,排序方式就按照数组的顺序,比如
a1,b1,....x1
a1, b2,....x1
....
ax,bx.....xNm
晒月光的青蛙 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goodhavens 的回复:]
每个数组必须要取出一个数吗? 就假设是。 你看下面这样是否是你要的:
数组1: Ar1{a1,a2,...,aN1}
数组2: Ar2{b1, b2,...bN2}
...
数组m: Arm(x1, x2,...xNm}

1. 随机下标
int RandIndex(int nMin, int nMax)
{
int RANGE_MIN = nMin;
int RANGE_MAX = nMax;
int nRet = (((double) rand() / (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
return nRet;
}
2. 依次随机取得各数组…
[/Quote]
这样可以产生一个随机组合数,不错
晒月光的青蛙 2009-05-21
  • 打赏
  • 举报
回复
假设有n个数组,每个数组有M1,M2,....Mn个元素
则结果为C(M1,1)*C(M2,1)*.....*C(Mn,1);
goodhavens 2009-05-21
  • 打赏
  • 举报
回复
每个数组必须要取出一个数吗? 就假设是。 你看下面这样是否是你要的:
数组1: Ar1{a1,a2,...,aN1}
数组2: Ar2{b1, b2,...bN2}
...
数组m: Arm(x1, x2,...xNm}

1. 随机下标
int RandIndex(int nMin, int nMax)
{
int RANGE_MIN = nMin;
int RANGE_MAX = nMax;
int nRet = (((double) rand() / (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
return nRet;
}
2. 依次随机取得各数组的一个数:
Ar1: y1 = RandIndex(1, N1);
Ar2: y2 = RandIndex(1, N2);
.....
Arm: ym = RandIndex(1, Nm);

然后将y1, y2, ym按你想要的方式组合起来。(至于怎么组合,你的题意不明。)
liao05050075 2009-05-21
  • 打赏
  • 举报
回复
上面的程序还要加个记录你选了哪些数的数组

array[N];//下标从0开始
int num[N];//num[i]保存了array[i]的元素个数
int choose[N];//记录你选了哪个数
int combine(int p)
{
if(p>=N)//已经到了最后一个数组的下一个,也就是不用再枚举了
{
toDoWithTheCombine();//枚举出一了个组合
return;
}
int i;
for(i=0;i<num[p];i++)
{
choose[p]=array[p][i]; //记录你选的数
combine(p+1); //取下一个数组个的数字
}
}

liao05050075 2009-05-21
  • 打赏
  • 举报
回复
N不定的话,你可以使用递归来解决。
大概这么写:


array[N];//下标从0开始
int num[N];//num[i]保存了array[i]的元素个数

int combine(int p)
{
if(p>=N)//已经到了最后一个数组的下一个,也就是不用再枚举了
{
toDoWithTheCombine();//枚举出一了个组合
return;
}
int i;
for(i=0;i<num[p];i++)
combine(p+1); //取下一个数组个的数字
}
goodhavens 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Chrissie 的回复:]
引用 5 楼 ouyh12345 的回复:
a1,b1,....x1
a1, b2,....x1
....
ax,bx.....xNm

直接一个n层循环就能输出

n的个数不定,怎么写这个循环?
[/Quote]

没错。
闪破风浪 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Chrissie 的回复:]
引用 5 楼 ouyh12345 的回复:
a1,b1,....x1
a1, b2,....x1
....
ax,bx.....xNm

直接一个n层循环就能输出

n的个数不定,怎么写这个循环?
[/Quote]
你可以sizeof(a)/sizeof(int)
Chrissie 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ouyh12345 的回复:]
a1,b1,....x1
a1, b2,....x1
....
ax,bx.....xNm

直接一个n层循环就能输出
[/Quote]
n的个数不定,怎么写这个循环?

19,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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