DFS 选数(去重全排列)

题目

题目链接

代码

这个题解方法是真的好!!!!!!
一定要仔细看一下

/*
这题主要是一个去重的dfs,而且将函数的参数设置为三个,真的无比巧妙啊 
*/

#include<iostream>
#include<math.h>

using namespace std;
const int N=22;

int a[N];

int n,k;

long long ans;

int check(int x){
	if(x==2)
		return 1;
	for(int i=2;i<=sqrt(x);i++)
		if(x%i==0)
			return 0;
	return 1; 
}

void dfs(int m,int sum,int start){//三个参数分别表示搜寻到的层数,当前总和,开始运算的起点 
		/*这让我领悟到,其实dfs的参数不是固定的层数,它可以有多个参数 
		  这表现的是列举的每一个情况的  “状态!”
		  就像这道题目的sum,我一直疑惑怎么才能定义一个局部变量,使得它具有局部的sum
		  但是,直接作为参数传递就完全可以了 
		*/
		if(m==k+1){
			if(check(sum))
				ans++;
			return;
		}//就是判断列举是否over 
		for(int i=start;i<=n;i++){
			dfs(m+1,sum+a[i],i+1);
			/*
			这里很巧妙,第二个参数直接是,sum+a[i],以此作为和
			第三个参数表示要开始的地方,这个画图体会一下
			每一层开始的第一个选择的参数一定是上一层层数加一的下标 
			*/ 
		}		
} 

int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	dfs(1,0,1);
	cout<<ans<<endl;
	return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值