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;
}