早教吧作业答案频道 -->其他-->
重谢.求大神写一个C++程序并附带注释,然后说明一下所用的算法.程序要求如下•3.给出n个整数,找出其中任意r个数的所有可能的组合.例如n=5,(23,36,17,6,29),r=3,则所有组合为:233617233662336
题目详情
重谢.求大神写一个C++程序并附带注释,然后说明一下所用的算法.程序要求如下
•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
•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
▼优质解答
答案和解析
#include
/*
算法概要:
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{
cout<}
cout<}
else
{
for (int i=aindex; 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{
cout<<"n"<cin>>a[i]; // 输入数据
}
CC(a, n, r); // 组合输出
delete[] a;
return 0;
}
/*
算法概要:
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
cout<
cout<
else
{
for (int i=aindex; 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
cout<<"n"<cin>>a[i]; // 输入数据
}
CC(a, n, r); // 组合输出
delete[] a;
return 0;
}
看了重谢.求大神写一个C++程序并...的网友还看了以下:
1.有5个大小相同的罐子,每个罐子里有若干相同设计的硬币,每枚硬币质量为10g,但是由于机械误差, 2020-07-09 …
已知(a2+b2-c2)/2ab+(b2+c2-a2)/2bc+(a2+c2-b2)/2ac=1, 2020-07-09 …
历史为什么会留下这样两幅迥然不同的画像不要(这很简单啊,因为有一个是按照真实有一个阿谀奉承或是为了 2020-07-28 …
Sn为等差数列的前n项和,若Sn的极限存在,则这样的数列A.有且仅有一个B.有无穷多个C.有一个或 2020-07-31 …
1,在一个正方形内有N个点,加上正方形的4个顶点共(N+4)个点现将正方形分割成以这(N+4)个点 2020-08-01 …
这道题的解题过程是?如果两个角有一条(如果两个角有一条()边,并且它们的另一边互为(),那么具有这 2020-08-03 …
两个瓶有一个专用的塞子连在一起,中间有一个小孔连通,一个瓶子装满水,当倒过来时,为什么水不流下来?为 2020-11-14 …
有一个人白手起家,成了富翁.他为人慷慨,热心于慈善事业.一天,他了解到有三个贫困家庭,生活难以为有一 2020-11-14 …
三段论是由两个含有一个共同项的性质判断作前提得出一个新的性质判断为结论的演绎推理.即由一个共同词项把 2020-11-23 …
磁感应强度和磁场力的方向不一样?如果一样为什么有些题明明有磁感应强度方向了,还要问磁场力的方向?比如 2020-11-28 …