洛谷P1036 选数
程序员文章站
2022-07-13 11:09:55
...
题目
输入格式
输出格式
屏幕输出,格式为: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;
}
下一篇: POJ - 1151(线段树+扫描线)