早教吧作业答案频道 -->其他-->
重谢.求大神写一个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++程序并...的网友还看了以下:
不到400个苹果,2个人可以平分.3个人可以,5个人可以.9个人可以,13个人可以平分但是弄不清楚 2020-06-03 …
5个球放在1-7号7个抽屉里,5个球可以放在一个抽屉,也可以让抽屉空着,有几种放法?例如,把5个球 2020-06-12 …
初二苏教版基础练习题必须包括:注音5个写词5个文学常识5个!默写5个!不可以重复!1苏教版!越快越 2020-06-29 …
从5个中选3个(C53)和从5个中选2个再从剩余3个中选1个(C52*C31)从5个中选3个(C5 2020-06-30 …
对于排列组合来说什么时候用C51,什么时候用A51,虽然都得5,但怎么区分阿,比如说7个人,甲乙两 2020-07-09 …
分析推理,先填表再找规律.点数增加条数234总条数136根据表中的规律,请你解决问题:(1)5个点 2020-07-25 …
不共面的5个点可以确定几个平面怎么是10个那么少呢,不共线的4个点可以确定4个面,分情况讨论,5* 2020-07-29 …
求一道数奥题答案如果一个多边形的每个内角都小于180度,则称为凸多边形.平面上有5个点,其中任何3 2020-08-02 …
观察圆周上n个不同点之间所连的弦,发现两个点可以连一条弦,3个点可以连3条弦,4个点可以连6条弦,5 2020-11-03 …
80C51单片机有5个中断源,但只能设置两个中断优先级。因此,在中断优先级安排上受到一定的限制。试问 2020-12-03 …