洛谷-P1036 选题
题目:https://www.luogu.org/problemnew/show/P1036
题解:
回溯,注意不OK的条件,只能是a_i >= a_i-1排列
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<cmath> using namespace std; int n,k; int numBox[25]; int v[25]; int flag = 1; int ans = 0; bool isPrime(int a){ int sqr = (int) sqrt(a); for(int i=2;i<=sqr;i++){ if(a % i == 0){ return false; } } return true; } void choose(int cur,int res){ if(cur == k){ //cout << res << endl; if(isPrime(res)){ ans++; } return; }else{ for(int i=cur;i<n;i++){ int ok = 1; for(int j=0;j<cur;j++){ if(v[j] >= i){ ok = 0; } } if(ok){ v[cur] = i; choose(cur+1,res+numBox[i]); } } } } int main(void){ cin >> n >> k; int tmp; for(int i=0;i<n;i++){ cin >> tmp; numBox[i] = tmp; } choose(0,0); cout << ans; return 0; }