寒假学习
今天做了一道暴力枚举题
这道题的思路很明确,只要将所有可能性都计算一遍,即可得出答案。
但是题目的要求是从 n
个数字中选出 k
个元素相加。如果 k
是个定值,
那么我们只需要写 k
个 for( ; ; )
循环嵌套即可,但是 k
需要输入,是变量而我们在代码中写的循环层数是定值。所以这个方法不可行,除非你真的有耐心能写出20层循环嵌套。(不推荐,代码量太大)
不确定的循环,用递归代替
#include<cstdio>
#include<iostream>
using namespace std;
int n,k,c=0,l;
int a[21][21];
int prime(int i);
int step(int i,int l,int s,int f);
int main(){
int s=0;
cin>>n>>k;
l=n-k;
for(int i=0;i<n;i++){
cin>>a[0][i];
for(int j=0;j<k;j++){
a[j][i]=a[0][i];
}
}
for(int j=0;j<=l;j++)
step(j+1,l+1,s+a[0][j],1);
cout<<c;
}
int prime(int i){
for(int j=2;j<i/2;j++){
if(i%j==0)return 0;
}
return 1;
}
int step(int i,int l,int s,int f){
if((f!=k-1&&l>=n-1)||i>l)return 0;
if(f==k-1){
for(int j=i;j<=l;j++){
c=c+prime(s+a[f][j]);
}
}
else {
for(int j=i;j<=l;j++)
step(j+1,l+1,s+a[f][j],f+1);
}
return 0;
}
自己写的时候用了二维数组,不过n的是最大只有20。
代码应该可以再简化.
写递归时一定要注意边界问题的条件,否则会死循环。