洛谷 P1036 选数 (记忆化搜索)

洛谷 P1036 选数 (记忆化搜索)_第1张图片

#include 
#include 
using namespace std;
typedef long long  ll;
ll a[1005];
bool isprime(int a)
{
    for(int i = 2; i * i <= a; i++)
    if(a % i == 0)
        return  false ;
    return  true;
}
int  n  , k ;
bool vis[255];
ll ans = 0;
void dfs(int m, int sum , int startx)
{
    if(m == k)
    {
        if(isprime(sum))
            ans++;
        return ;
    }
    for (int i = startx ; i < n; i++)
    {
        if(vis[i])
            continue;
        vis[i] = true;
        dfs(m + 1, sum + a[i], i + 1);
        vis[i] = false;
        
    }
    return ;
    
}
int main()
{
    cin >> n >> k;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    dfs(0,0,0);
    cout<<ans;
    return 0;
    
}

你可能感兴趣的:(进阶)