1.24模拟赛补充

 

 

 

这道题就是一道搜索求和的问题,用到了回溯,找到后直接输出结束即可,反之无解,注意有一个优化就是输入的时候累加求和,如果总和都不够,那就必然不够

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,c,s[10000],flag,ans[10000],vis[10000];
void print(int x){
    for(int i=1;i<=x;++i){
        printf("%d ",ans[i]);
    }
    flag = 1;
}
int jia;
void dfs(int sum,int cur){ 
    //printf("%d ",++jia);
    if(cur > n)return;
    if(sum == c){
         print(cur-1);
         exit(0);
    }
    if(sum > c)return;
    for(int i=1;i<=n;++i){
        if(!vis[i] && sum + s[i] <= c){ 
         vis[i] = 1;
         ans[cur] = s[i];
         dfs(sum+s[i],cur+1);
         vis[i] = 0;
        }
    }
}
int main(){
    scanf("%d%d",&n,&c);
    for(int i=1;i<=n;++i){
        scanf("%d",s+i);
        jia += s[i];
    }
    if(jia < c){
        puts("No Solution!");
        return 0;
    }
    dfs(0,1);
    puts("No Solution!");
}

 

 在二维数组里面搜索,与八皇后类似,回溯做法

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,a[30][30],mini = 1e9,vis[25];
void dfs(int sum,int cur){
    if(sum > mini)return;
    if(cur == n + 1){
        mini = min(mini,sum);
        return ;
    }
    for(int i=1;i<=n;++i){
        if(!vis[i]){
            vis[i] = 1;
            dfs(sum+a[cur][i],cur+1);
            vis[i] = 0;
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j)scanf("%d",&a[i][j]);
    }
    dfs(0,1);
    printf("%d",mini);
}
/*
3
4 2 5
2 3 6
3 4 5
*/

 

 

 

 这题直接dfs他,用回溯会慢(有可能挂掉,不过我没试),其实01背包也可,不过重在练习搜索

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,c,w[1005],ma = -1e9;
void dfs(int sum,int cur){    
    //printf("sum=%d cur=%d\n",sum,cur);
    if(sum > c)return ;ma = max(ma,sum);
    if(cur == n + 1){
        return ;
    }
    dfs(sum,cur+1);
    dfs(sum+w[cur],cur+1);
} 
int main(){
    scanf("%d%d",&n,&c);
    for(int i=1;i<=n;++i)scanf("%d",&w[i]);
    dfs(0,1);
    printf("%d",ma);
}

 

 

 

   

posted @ 2022-01-24 15:47  Xu_brezza  阅读(27)  评论(0编辑  收藏  举报