从N个元素中取k个元素子集的c++实现
2008-04-26 19:50
225 查看
#include <iostream>
#include <vector>
using namespace std;
int C( int n, int m) //计算组合数
{
if ( n == 0 )
return 1;
int res = 1;
int temp = m - n;
for( int i = m; i != temp; --i )
res *= i;
for( int j = n; j > 1; --j )
res /= j;
return res;
}
int main()
{
const int N = 8;
int Array[] = { 1, 2, 3, 4, 5, 6 ,7 ,8 };
//cout << "Please enter the array" << endl;
//for (int i1 = 0; i1 < N; cin >> Array[i1++]);
//for( int a = 0; a < N; ++a )
//cout << Array[a] << endl;
cout << "Please input K" << endl;
int K;
cin >> K;
int num = C( K, N );
vector< vector<int> > ivec(num); //K个元素子集的个数
vector< vector<int> >::iterator it;
vector< vector<int> >::size_type index = 0;
//先存储第一列数
for( int i = 0; i <= N - K; ++i )
for( int j = 0; j < C( K - 1, N - i - 1 ); ++j )
ivec[index++].push_back( Array[i] );
for( int k = 1; k < K; ++k )
{
index = 0;
for( int i = k; index < ivec.size(); ++i )
{
for( int j = 0; j < C( K - k - 1, N - i -1 ); ++j )
ivec[index++].push_back( Array[i] );
if( i == N - K + k && index < ivec.size() )
i = ivec[index][k - 1] - 1;
}
}
cout << "Here is the result !" << endl;
cout << "There are "
<< ivec.size()
<< " subarray"
<< endl;
for( it = ivec.begin(); it != ivec.end(); ++it )
{
for( vector<int>::iterator it1 = (*it).begin(); it1 != (*it).end(); ++it1 )
cout << *it1;
( it + 1 - ivec.begin()) % 10 ? cout << " " : cout << endl;
}
return 0;
}
这是算法设计与分析的一道作业题,基本思路是通过想实现的结果发现每一个数出现的次数都跟组合数有一定的关系,并根据这种关系将子集存放在一个二维vector里。
#include <vector>
using namespace std;
int C( int n, int m) //计算组合数
{
if ( n == 0 )
return 1;
int res = 1;
int temp = m - n;
for( int i = m; i != temp; --i )
res *= i;
for( int j = n; j > 1; --j )
res /= j;
return res;
}
int main()
{
const int N = 8;
int Array[] = { 1, 2, 3, 4, 5, 6 ,7 ,8 };
//cout << "Please enter the array" << endl;
//for (int i1 = 0; i1 < N; cin >> Array[i1++]);
//for( int a = 0; a < N; ++a )
//cout << Array[a] << endl;
cout << "Please input K" << endl;
int K;
cin >> K;
int num = C( K, N );
vector< vector<int> > ivec(num); //K个元素子集的个数
vector< vector<int> >::iterator it;
vector< vector<int> >::size_type index = 0;
//先存储第一列数
for( int i = 0; i <= N - K; ++i )
for( int j = 0; j < C( K - 1, N - i - 1 ); ++j )
ivec[index++].push_back( Array[i] );
for( int k = 1; k < K; ++k )
{
index = 0;
for( int i = k; index < ivec.size(); ++i )
{
for( int j = 0; j < C( K - k - 1, N - i -1 ); ++j )
ivec[index++].push_back( Array[i] );
if( i == N - K + k && index < ivec.size() )
i = ivec[index][k - 1] - 1;
}
}
cout << "Here is the result !" << endl;
cout << "There are "
<< ivec.size()
<< " subarray"
<< endl;
for( it = ivec.begin(); it != ivec.end(); ++it )
{
for( vector<int>::iterator it1 = (*it).begin(); it1 != (*it).end(); ++it1 )
cout << *it1;
( it + 1 - ivec.begin()) % 10 ? cout << " " : cout << endl;
}
return 0;
}
这是算法设计与分析的一道作业题,基本思路是通过想实现的结果发现每一个数出现的次数都跟组合数有一定的关系,并根据这种关系将子集存放在一个二维vector里。
相关文章推荐
- 从N个元素中取k个元素子集的减治法实现
- 构造链表ABC,删除在A中的ABC的公共元素_C++实现
- 列出所有K个元素的子集-----2013年1月26日
- C++实现数组中出现最频繁的前top k个元素
- C++实现最小堆及插入,调整顺序,删除堆顶元素的操作
- 【C++】容器适配器实现队列Queue的各种功能(入队、出队、判空、大小、访问所有元素等)
- Java实现集合的组合(从组合中取出K个元素进行组合的所有情况)
- k个元素的子集 C(n,k)
- C++实现栈中元素排序
- 【C++ STL应用与实现】56: 使用std::unique删除重复元素
- C++实现最小堆及插入,调整顺序,删除堆顶元素的操作
- n个数中取k个使得乘积最大(c++实现)
- 用priority_queue实现找出数组中前K个大的元素
- 循环中删除map元素的写法; 在C++环境下,实现一行一行地读入文本文档
- 面试题: 已知一个含有n个不同元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的)
- 列出所有K个元素的子集-----2013年1月26日
- 【C语言】递归实现元素的全排列和子集
- c++实现两个元素进栈和出栈的顺序
- [C,C++] - 妙用0元素数组实现大小可变结构体
- C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结