请算法方面的高手帮忙:如何遍历所有的组合!

8611 2006-05-25 03:33:53
在工作中遇见的难题,可以简化为如下的数学模型:已知数组A和B,长度为n,数据类型为double。从A的n个元素中任取m个数(1<=m<=n),按照相同的下标从B中相应取出m个数,P=(A[i1]+A[i2]...+A[im])/(B[i1]+B[i2]+...+B[im])。如何遍历所有的m计算出所有的P,从而得到P的最大值和最小值。
...全文
406 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
province_ 2006-05-30
  • 打赏
  • 举报
回复
这题不难,其实就是求N个元素的全部组合。
sharpdew 2006-05-28
  • 打赏
  • 举报
回复
还有别的算法吗
~~~~~~~~~~~~~
看这个:
http://blog.csdn.net/sharpdew/archive/2006/05/25/755074.aspx
8611 2006-05-26
  • 打赏
  • 举报
回复
当从A、B中取m个数时,要遍历取m个数所有的组合(而不是排列),即i1、i2、...、im不一定为从小到大连续的整数,仅表示从A中和从B中取数时,元素的下表要对应。

8611 2006-05-26
  • 打赏
  • 举报
回复
还有别的算法吗
8611 2006-05-25
  • 打赏
  • 举报
回复
谢谢楼上,下载后回去研究一下。
sharpdew 2006-05-25
  • 打赏
  • 举报
回复
解决排列组合问题的常用算法是递归,当然有递归就会有相应的回溯算法,回溯算法效率往往更高,特别是对于大型的排列组合问题,递归会引起栈溢出,所以我给你回溯的例子,至于递归的可以看我最近的blog文章分析。
// a[1..n]表示候选集,m表示一个组合的元素个数
int combine(int a[], int n, int m)
{
int* order = new int[m+1];
order[0] = -1;
for(int i=1; i<=m; i++)
order[i] = i-1;

int count = 0;
int k = m;
bool flag = true;
while(order[0] == -1)
{
if(flag)
{
// 输出符合要求的组合
for(i=1; i<=m; i++)
cout << a[order[i]] << " ";
cout << endl;
count++;
flag = false;
}

order[k]++;
if(order[k] == n)
{
order[k--] = 0;
continue;
}

// 在此加入order[k]的限制条件
// 如果条件满足,则往下执行
if(k < m)
{
order[++k] = order[k-1];
continue;
}

if(k == m)
flag = true;
}

delete[] order;
return count;
}


int main()
{
const int N = 10;
int a[N];
for(int i=0;i<N;i++)
a[i] = i+1;

cout << combine(a,N,3) << endl;

return 0;
}

33,026

社区成员

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

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