1. 程式人生 > >輸出N個數中取M個數的所有組合,排列情況

輸出N個數中取M個數的所有組合,排列情況

一般思路是由組合算排列,現在藉助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); 
}