p1036题,佬们,为什么这个代码只能过4个测试点,我加了注释方便看一下吗
查看原帖
p1036题,佬们,为什么这个代码只能过4个测试点,我加了注释方便看一下吗
1281742
LeLe422楼主2024/2/28 23:29

实在是看不出来了,救救孩子吧

#include <iostream>
#include <vector>
using namespace std;

int n,r;
const int N = 25;
int nums[N];//接收输入
vector<int> ans;//用来存储每次选出来的组合
bool use[N];//标记,用于选数
int cnt;//count计数器

bool is_prime(long long x)//素数判断
{
    for(int i=2; i*i<=x; i++)
    {
        if(x%i==0)
            return false;
    }
    return true;
}

void dfs(int depth)//depth相当于递归树深度,习惯这样表示了,大佬们见谅

{
    if(depth == r)
    {
        long long sum = 0;//这里怕爆数据,不过可能多余了           
        for(int i=0; i<depth; i++)
        {
            sum+=ans[i];    
        }
        if(is_prime(sum))
            cnt++;
        return;
    }
    for(int i=0; i<n; i++)
    {
        if(!use[i])
        {
            if(ans.size() > 0 && ans.back() > nums[i])//这里为了保证当前选出来的数要比上个数大,否则就不和组合的规定
            {
                continue;
            }
 //下面就是dfs的模版
            use[i] = true;
            ans.push_back(nums[i]);
            dfs(depth+1);
            use[i] = false;
            ans.pop_back();
        }
    }
}

int main()
{
    cin>>n>>r;
    for(int i=0; i<n; i++)
        cin>>nums[i];
    dfs(0);
    cout<<cnt<<endl;
    return 0;
}
2024/2/28 23:29
加载中...