全排列的实现

来源:互联网 发布:btsow新域名 编辑:程序博客网 时间:2024/05/17 07:49

DFS实现

直接以题目为例:

来源:洛谷P1036

题目描述

从n个数中选出k个数并求和,判断所有的和为素数的个数

//void dfs(int pos, int pps, int sum)//pos:还需pos个数才能凑够k个数//sum:当前k-pos个数的和//pps:当前k-pos个数   的最后一个数   的下一个数#include<iostream>using namespace std;int a[30];int ans = 0;int n, k;int is_prime(int p){    int i;    if(p == 2) return 1;    for(i = 2; i * i <= p; i++)        if(p%i == 0) return 0;    return 1;}void dfs(int pos, int pps, int sum){    if(!pos){                               ///pos==0 意味着已选够k个数了,判断这k个数的和是否为素数        ans += is_prime(sum);        return;    }    for(pps; pps < n; pps++)        dfs(pos-1, pps+1, sum+a[pps]);      ///递归dfs 所需数的个数少1 其中pps+1是a[pps]的下一个}int main(){    cin >> n >> k;    int i;    for(i = 0; i < n; i++)        cin >> a[i];    dfs(k,0,0);                             ///需要选k个数  从第0个数开始选  当前数的和为0    cout << ans << endl;    return 0;}

库函数实现——next_permutation()

头文件:algorithm
函数定义:bool next_permutation(iterator begin, iterator end);

//每调用一次将会对s[ ]进行一次重新排列#include <iostream>#include <algorithm>#include <cstring>using namespace std;char s[500];int main(){    cin >> s;    sort(s, s+strlen(s));    do    {        cout << s << endl;    }while(next_permutation(s, s + strlen(s)));    return 0;}
原创粉丝点击