求救!求几个元素的的组合的算法???????

huiguo309 2003-10-15 06:17:18
输入{L1},{L2},{L3},{L4},{L5}
输出各元素的组合:{L1},{L2},{L3},{L4},{L5},{L1,L2},{L1,L3},{L1,L4},{L1,L5},{L2,L3},{L2,L4},{L2,L5},{L3,L4},{L3,L5},{L4,L5},{L1,L2,L3},{L1,L2,L4},{L1,L2,L5},{L1,L3,L4},{L1,L3,L5},{L1,L4,L5},{L2,L3,L4},{L2,L3,L5},{L2,L4,L5},{L3,L4,L5},{L1,L2,L3,L4},{L1,L2,L3,L5},{L1,L3,L4,L5},{L2,L3,L4,L5},{L1,L2,L3,L4,L5}
请各位大侠帮我写写算法。谢了!!
...全文
47 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
darcymei 2003-10-16
  • 打赏
  • 举报
回复

写了个实现,输入int型的,用回朔法。效率不是很高。

#include <iostream>

using namespace std;

struct Elem
{
int entry;
bool flag;
};

Elem * arr; //用于保存输入的一个数组
int * temp;//用于显示的数组

void prin(int size ,int count,int temp_size);

int main()
{
int size;
cout<<"Please enter the how many numbers you want enter: ";
cin>>size;
arr= new Elem [size];
cout<<"Please enter them " <<endl;
for(int i=0;i<size;i++)
{
cin>>arr[i].entry ;
arr[i].flag =true;
}
for(i=1;i<=size;i++)
{
temp=new int [i] ;
prin(size,i,i);
delete [] temp;
}
return 0;
}

void prin(int size ,int count,int temp_size)
{
if(count==0)
{
cout<<"{";
for(int i=0;i<temp_size;i++)
cout<<temp[i];
cout<<"}\t";
}
else
{
for(int front=0;front<size;front++)
{
if(arr[front].flag)
{
temp[temp_size-count]=arr[front].entry;
arr[front].flag =false;
prin(size,count-1,temp_size);
arr[front].flag =true;
}

}
}
}
ilikethis 2003-10-16
  • 打赏
  • 举报
回复
找本组合数学,看完算法可以自已写代码,何必求人。
wangyangcheng 2003-10-16
  • 打赏
  • 举报
回复
TO: hbDeng(laoshan)
error C2065: 'power' : undeclared identifier
hbDeng 2003-10-16
  • 打赏
  • 举报
回复
算法思想:用一个五位的二进制码来表示含有五个元素的集合。例如:
集合{L1},{L2},{L3},{L4},{L5}可分别表示为00001,00010,00100,01000,10000
变为十进制为1,2,4,8,16。
集合中含有哪个元素,则元素对应的相应位写1,否则写0。
例如:集合{L1,L3,L5}表示为10101。
所以,题中要求的输出用二进制码表示00001,00010,00100,01000,10000,00011,
00101,00110,01100,11000,10100,。。。。,11111
如果调整一下顺序再看看00001,00010,00011,00100,00101,00110,00111,01000,
01001,01010,01011,01100,01101,01110,01111,10000,10001,10010,10011,10100,10101,10110,10111,11000,11001,11010,11011,11100,11101,11110,11111
看出门道没有?什么?没有!把它们变为十进制再看看1,2,3,4,5,6,7,。。。。,27,28,29,30,31 总个数是31个正好是2^5-1(二的五次方减一)。
这个不用我再解释了吧?
代码:
//作者:邓侯斌
//2003.10.16
//求一个集合的所有子集(不含空集)
#include <iostream>
#define MAX_SIZE 16
char Input[MAX_SIZE];//保存输入的各元素,下标为该元素的编号
//例如:输入的共4个元素Input【3】=L4 ,则L4的编号为3
int main()
{
int n = 0;

//输入过程
cout << "请输入元素个数n【n<167】:" << endl; cin >> n;
cout << "依次输入各元素:";
for(int i = 0;i < n;i++)
cin >> Input[i];
//输出过程
for(i=1;i<power(2,n)-1;i++)//要输出的所有集合的二进制编码,转换为十进制
//就是1到2^n-1的连续整数。
{
cout << "输出第" << i << "个数组:{";
for(int j=0;j<n;j++)
{ if( i & power(2,j) )//如果i的二进制数第j位为1,那么i集合中含有
//下标为j的元素
cout << Input[j] << ','//输出下标为j的元素
}
cout << "}" << endl;
}
return 0;
}
//The code is end
//这个代码应该是最短的了
huiguo309 2003-10-16
  • 打赏
  • 举报
回复
谢了!csdn上果然高手如云。我看了上面两位的代码给我很大的启发。特别是 hbDeng(laoshan)的。怎么给分?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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