选数
https://www.luogu.com.cn/problem/P1036
#include <bits/stdc++.h> using namespace std; int n,k,a[30]; long long ans; bool isprime(int a){ for(int i=2;i*i<=a;i++){ if(a%i==0) return false; } return true; } void dfs(int m,int sum,int st){ if(m==k){ if(isprime(sum)) ans++; return; } for(int i=st;i<=n;i++) dfs(m+1,sum+a[i],i+1); return; } int main(){ cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; dfs(0,0,1); cout<<ans; return 0; }
覆盖墙壁
https://www.luogu.com.cn/problem/P1990
#include <bits/stdc++.h> using namespace std; //f[N] 铺满前N*2面积的墙的方案数 //G[N] 铺满前(N+1)*2的面积的墙,但是第(N+1)列有一个瓷砖已经被铺过 //f[N]=f[N-1]+f[N-2]+2*G[N-2] //G[N]=f[N-1]+G[N-1] int f[1000010],g[1000010]; const int mod=10000; int main(){ int n; cin>>n; f[0]=1; g[0]=0; f[1]=1; g[1]=1; for(int i=2;i<=n;i++){ f[i]=(f[i-1]+f[i-2]+2*g[i-2])%mod; g[i]=(f[i-1]+g[i-1])%mod; } cout<<f[n]; return 0; }
自然数的拆分问题
https://www.luogu.com.cn/problem/P2404
#include <bits/stdc++.h> using namespace std; int n,m,a[20]={1},cnt=1; void print(int t){ for(int i=1;i<t;i++)cout<<a[i]<<"+"; cout<<a[t]<<endl; } void dfs(int cnt){ for(int i=a[cnt-1];i<=m;i++){ if(i==n) continue; a[cnt]=i; m-=i; if(m==0) print(cnt); else dfs(cnt+1); m+=i; } } int main(){ cin>>n; m=n; dfs(1); return 0; }