搜索与回溯
P1157 组合的输出
原题见洛谷。
这道题是非常典型的搜索与回溯,主要就是把所有可能筛一遍并依次输出。
search写法:
#include<bits/stdc++.h>
using namespace std;
int num=0,a[10001],n,r;
bool b[10001];
void print(){
for(int i=1;i<=r;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
int search(int t){
for(int i=1;i<=n;i++){
if(b[i]==0){
a[t]=i;b[i]=1;
if(t==r){print();num++;}
else search(t+1);
b[i]=0;
}
}
}
int main(){
cin>>n>>r;
search(1);
return 0;
}
dfs写法:
#include<bits/stdc++.h>
using namespace std;
int n,r,a[30];
void print(){
for(int i=1;i<=r;i++){
printf("%3d",a[i]);
}
cout<<endl;
}
int dfs(int x,int y){
if(y>r){print();return 0;}
for(int i=x;i<=n;i++){
a[y]=i;
dfs(i+1,y+1);
}
}
int main() {
cin>>n>>r;
dfs(1,1);
return 0;
}
个人认为dfs写起来比较短所以喜欢dfs。
P2404 自然数的拆分问题
原题同样见洛谷。
这道题依旧可以用递归和搜索解决。
search写法:
#include<bits/stdc++.h>
using namespace std;
int tot=0,n,a[10001];
void print(int t){
cout<<n<<"=";
for(int i=1;i<t;i++) cout<<a[i]<<"+";
cout<<a[t]<<endl;
tot++;
}
int search(int s,int t){
for(int i=a[t-1];i<=s;i++){
if(i<n){
a[t]=i;s-=i;
if(s==0) print(t);
else search(s,t+1);
s+=i;
}
}
}
int main(){
a[0]=1;
cin>>n;
search(n,1);
cout<<tot<<endl;
return 0;
}
dfs写法:
#include<bits/stdc++.h>
using namespace std;
int n,a[100];
int dfs(int x,int y,int z){
if(y>n) return 0;
if(y==n){
for(int i=1;i<z;i++){
if(i>1) printf("+");
cout<<a[i];
}
cout<<endl;
return 0;
}
for(int i=x;i<n;i++){
a[z]=i;
dfs(i,y+i,z+1);
}
}
int main(){
cin>>n;
dfs(1,0,1);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具