zoukankan      html  css  js  c++  java
  • 【洛谷】P1036选数(dfs)

    题目链接

    题目描述

    已知 n 个整数 x1​,x2​,…,xn​,以及1个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:

    3+7+12=22

    3+7+19=29

    7+12+19=38

    3+12+19=34。

    现在,要求你计算出和为素数共有多少种。

    例如上例,只有一种的和为素数:3+7+19=29。

    输入输出格式

    输入格式:

    键盘输入,格式为:

    n,k(1≤n≤20,k<n)

    x1​,x2​,…,xn​(1≤xi​≤5000000)

    输出格式:

    屏幕输出,格式为: 1个整数(满足条件的种数)。

    利用dfs检查每种情况。

    新增一个sum数组用来记录选取i个数的和。当选取够k个数时判断和是否为素数即可。

    AC代码:

    #include<iostream>
    #include<sstream>
    #include<algorithm>
    #include<ctime>
    #include<cmath>
    #include<string>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<map>
    using namespace std;
    int n,k,x[21],sum[21],ans=0;//sum[i]为选取i个数的和 
    bool isprime(int num)//判断num是否为素数 
    {
    	if(num==2||num==3) return 1;
    	if(num%6!=1&&num%6!=5) return 0;
    	int b=sqrt(num);
    	for(int i=5;i<=b;i+=6)
    	if(num%i==0||num%(i+2)==0) return 0;
    	return 1;
    }
    void dfs(int step,int start)//从x_start开始选取第step个数,共选取step个数的和 
    {
    	if(step==k+1)//选完k个数,判断和是否为素数 
    	{
    		if(isprime(sum[k])) ans++;
    		//cout<<sum[k]<<endl;
    		return;
    	}
    	for(int i=start;i<=n;i++)//从start开始选,避免重复 
    	{
    		sum[step]=sum[step-1]+x[i];
    		dfs(step+1,i+1);
    	}
    }
    int main()
    {
    	memset(sum,0,sizeof(sum));
    	cin>>n>>k;
    	for(int i=1;i<=n;i++) cin>>x[i];
    	dfs(1,1);
    	cout<<ans;
    }
    
  • 相关阅读:
    汇总遇到的问题
    mybatis下载地址
    快速创建数据大绝招
    常见的dos命令
    添加react-native-icons中文傻瓜式教程
    react native配置环境watchman监控安装失败解决办法
    如何使用SwitchyOmega.crx谷歌插件
    Git与Github学习笔记
    HTTP协议详解
    使用npm安装一些包失败了的解决方法(npm国内镜像介绍),安装速度跟cnpm一样哦
  • 原文地址:https://www.cnblogs.com/wangzhebufangqi/p/12796142.html
Copyright © 2011-2022 走看看