重谢。求大神写一个C++程序并附带注释,然后说明一下所用的算法。程序要求如下

•3.组合问题给出n个整数,找出其中任意r个数的所有可能的组合。例如n=5,(23,36,17,6,29),r=3,则所有组合为:23361723366233... •3. 组合问题
给出n个整数,找出其中任意r个数的所有可能的组合。例如n=5,(23,36,17,6,29), r=3,则所有组合为:
2336 17 23 36 6 23 3629
2317 6 23 17 29 23 6 29
3617 6 36 17 29 36 6 29
17 6 29
展开
 我来答
felithuang
推荐于2016-02-13 · TA获得超过849个赞
知道小有建树答主
回答量:520
采纳率:50%
帮助的人:728万
展开全部
#include<iostream.h>

/*
算法概要:
a1, a2...a2
取第一个数a1作为组合的第一个数,然后从剩下的数a2...an中取r-1个数进行剩下的组合,完成一次循环
然后取第二个数a2作为组合的第一个数,然后从剩下的数a3...an中取r-2个数进行剩下的组合,完成一次循环
依此类推,得到全部的组合。
*/
/*
 进行排列输出的主函数
 a: n个数据的数组
 n: 数据个数
 r: 组合的r
 result: 缓存本次组合的数组
 aindex: 当前组合的a下标
 resultindex: 当前组合的结果下标
*/ 
void C(int a[], int n, int r, int result[], int aindex, int resultindex)
{
// 如果已经组合够r个数据,输出
if (resultindex >= r)
{
for (int x=0; x<r; ++x)
{
cout<<result[x]<<" "; // 循环输出组合的数据
}
cout<<endl;
}
else
{
for (int i=aindex; i<n; ++i)
{
result[resultindex] = a[i]; // 保存当前数据到组合中
C(a, n, r, result, i + 1, resultindex + 1); // 递归组合剩下的数据
}
}
}

// 组合,并进行环境初始化,然后调用组合函数C完成组合输出
void CC(int a[], int n, int r)
{

int* result = new int[r]; // 组合缓存
C(a, n, r, result, 0, 0); // 组合输出
delete[] result;
}

int main()
{
int n, r;
cout<<"n,r:";
cin>>n>>r; // 输入组合的n,r值
int* a = new int[n];
for (int i=0; i<n; ++i)
{
cout<<"n"<<i<<":";
cin>>a[i]; // 输入数据
}
CC(a, n, r); // 组合输出
delete[] a;

return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式