欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

洛谷P1036 选数

程序员文章站 2022-07-13 11:09:55
...

题目

洛谷P1036 选数

输入格式

洛谷P1036 选数

输出格式

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

输入输出样例
输入 #1
4 3
3 7 12 19
输出 #1
1
原题–>link
分析

本题的本质是回溯算法
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。(百度百科解释)

Code
#include <iostream>
#include <cmath>
using namespace std;
int str[21]={0};
int count=0,sum=0,k=0,n=0;//count->记录符合题意得次数,sum->累计求和
bool JudgePrimeNumber(int a)//判断素数
{
    if(a<=1)    return false;
    for (int i = 2; i <= sqrt(a); ++i) {
        if(a%i==0)  return false;
    }
    return true;
}
void dfs(int time,int i)//递归回溯 time->记录次数,i->坐标
{
    if(time==k)
    {
        if (JudgePrimeNumber(sum)) {
            count++;
            return;
        }
    }
    for (i; i <=  n; ++i) {
        sum+=str[i]; //累加
        dfs(time+1,i+1);
        sum-=str[i]; //回退
    }
}
int main()
{
    cin >> n>>k;
    for (int i = 1; i <= n; ++i) {
        cin >> str[i];
    }
    dfs(0,1);
    cout << count;
    return 0;
}