Loading

洛谷-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;
}

  

posted @ 2019-05-17 14:53  Doubest  阅读(131)  评论(0编辑  收藏  举报