3 条题解

  • 0
    @ 2022-10-2 11:06:57

    添加判断素数模块

    #include<bits/stdc++.h>
    using namespace std;
    int n, m, ans, a[25];
    bool vis[25];
    int Search(int k, int j){
    //k表示现在在放第k个数 || 我们现在在树的深度为k 
    	int i;
    	if( k > m ){
    	//当k>m时,表示我们已经放完 
    		//解需要满足“选的m个数的和是素数 ”这个条件才能输出 
    		int sum = 0;
    		for(i = 1; i <= m; ++i){
    			sum += a[i];
    		}
    		//计算选的m个数的和
    		if(isprime(sum)){
    			//和是素数,方案种数+1
    			ans++; 
    		} 
    		return 0;
    		//return 0; 和 else 必须有一个 
    	}
    	for(i = j+1; i <= n; ++i)
    	//n种算符可以尝试 
    	//现在选的算符序号应该大于上一个算符的序号j 
    	//上一个算符的序号j可以由Search函数进行传递     ||      用a数组去记录选的算符序号,具体算符数值另一个数组存储 
    		if(!vis[i]){
    		//第i种算符可以使用 
    			vis[i] = true;
    			//标记第i种算符已经使用 
    			a[k] = i;
    			//第k个位置,使用第i种算符 
    			//保存结果 
    			Search(k+1, i);
    			//去摆第k+1个位置,第k个位置的算符序号为i 
    			vis[i] = false;
    			//还原第i种算符
    			a[k] = 0;
    			//第k个位置上现在没有放算符 
    			//恢复结果 
    		}
    	return 0;
    }
    int main(){
    	//数据初始化
    	memset(a, 0, sizeof(a));
    	//每个位置没有放数,置0 
    	memset(vis, false, sizeof(vis));
    	//每种算符都没有使用过,置true
    	ans = 0;
    	//方案种数置0 
    	
    	//输入 
    	cin>>n>>m;
    	
    	//从第1个位置开始搜索(尝试/暴力模拟) 
    	Search(1);
    	
    	//输出
    	cout<<ans<<endl;
    	 
    	return 0;
    }
    
    • 0
      @ 2022-10-2 10:50:12

      #include<bits/stdc++.h> using namespace std; int n,m; int h[1000],v[1000]; int dfs(int u,int p) { if(u>m) { for(int i=1;i<=m;i++) { printf("%3d",h[i]); } cout<<endl; return 0; } for(int i=p+1;i<=n;i++) { if(v[i]==0) { h[u]=i; v[i]=1; dfs(u+1,i); v[i]=0; } } } int main() { cin>>n>>m; dfs(1,0); return 0; }

      • 0
        @ 2022-7-29 20:11:54
        #include<bits/stdc++.h>
        using namespace std;
        long n,k,i,a[25],cnt;
        bool c[25];
        long pd(long n)
        {
            if(n<2)return 0;
            for(long i=2;i<=sqrt(n);i++)if(n%i==0)return 0;
            return 1;
        }
        void dfs(long t,long s,long p)
        {
            long i;
            if(t==k+1)
            {
                if(pd(s))cnt++;
        //      return;
            }
            if(p==n+1)return;
            for(i=p;i<=n;i++)
            {
                if(!c[i])
                {
                    c[i]=1;
                    dfs(t+1,s+a[i],i);
                    c[i]=0;
                }
            }
        }
        int main()
        {
            cin>>n>>k;
            for(i=1;i<=n;i++)cin>>a[i];
            dfs(1,0,1);
            cout<<cnt;
            return 0;
        }
        • 1

        信息

        ID
        142
        时间
        1000ms
        内存
        256MiB
        难度
        4
        标签
        (无)
        递交数
        228
        已通过
        97
        上传者