搜索与回溯

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;
}

posted @   专吃小仙女  阅读(100)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示