3 条题解
-
0
添加判断素数模块
#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
#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
#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
- 上传者