您的位置:首页 > 其它

输出N个数中取M个数的所有组合,排列情况

2011-12-30 12:46 344 查看
一般思路是由组合算排列,现在借助Next_permutation函数由排列到组合。

1.组合

读入一个字符串,一个整数n,输出字符串中取n个字符的所有组合情况

算法:借助Next_permutation函数,构造一个大小为len=str.length()的数组,0表示要输出的数,1表示不要输出的数。

代码如下:

#include <iostream>
#include <string>
#include <algorithm>
#include <memory.h>
using namespace std;

int main()
{
	string str;
	int n;
	cin>>str>>n;
	int len=str.length();
	int a[100];
	memset(a,1,sizeof(a));
	for(int i=0;i<n;i++)
		a[i]=0;
	do
	{
		for(int i=0;i<len;i++)
		{
			if(a[i]==0)
				cout<<str[i];
		}
		cout<<endl;
	}while(next_permutation(a,a+len));
	system("pause");
	return 0;
}


2.排列

#include <iostream>
#include <string>
#include <algorithm>
#include <memory.h>
using namespace std;

int main()
{
	string str;
	int n;
	cin>>str>>n;
	int len=str.length();
	int a[100];
	char b[100];
	memset(a,1,sizeof(a));
	for(int i=0;i<n;i++)
		a[i]=0;
	do
	{
		int j=0;
		for(int i=0;i<len;i++)
		{		
			if(a[i]==0)
			{
				b[j]=str[i];
				j++;
			}
		}	
		do
		{
			for(int i=0;i<j;i++)
				cout<<b[i];
			cout<<endl;
		}while(next_permutation(b,b+j));
		cout<<endl;
	}while(next_permutation(a,a+len));
	system("pause");
	return 0;
}


排列回溯:

#include <iostream> 
using  namespace std; 

const  int  n=4;//总的元素数 
const  int  m=3;//需要排列的元素个数 

int  num[m];//记录状态的数组,保存各个位置的排列元素 

bool  is_valid(int  count) //判断第count次取数是否合理 
{ 
    for(int i=0;i<count;++i) 
    { 
        if(num[i]==num[count]) 
        { 
            return  false; 
        } 
    } 
    return  true; 
} 

void  choose_num(int count) //第count次选数 
{ 
    if(count==m)//选取的排列元素够了 
    { 
        for(int i=0; i<m; ++i) 
        { 
            cout<<num[i]; 
        } 
        cout<<endl; 
        return; 
    } 
    for(int i=1;i<=n;++i)//如果没选够,选择一个数,合理后递归调用 
    { 
        num[count]=i; 
        if(is_valid(count)) 
        { 
            choose_num(count+1); 
        } 
    } 
} 

int main() 
{ 
    choose_num(0); 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: