• 回溯例题(计算机算法设计与分析)


    P153:子集和问题

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int n,s;
     6 bool vis[100];
     7 int a[100];
     8 bool calc(int cur) {
     9     if(cur==s) {
    10         for(int i=0;i<n;i++) {
    11             if(vis[i])
    12                 printf("%d ",a[i]);
    13         }
    14         puts("");
    15         return true;
    16     }
    17     else {
    18         for(int i=0;i<n;i++) {
    19             if(!vis[i]) {
    20                 vis[i] = true;
    21                 if(calc(cur+a[i]))
    22                     return true;
    23                 vis[i] = false;
    24             }
    25         }
    26     }
    27     return false;
    28 }
    29 
    30 int main()
    31 {
    32     freopen("in.txt","r",stdin);
    33     scanf("%d%d",&n,&s);
    34     for(int i=0;i<n;i++) {
    35         scanf("%d",&a[i]);
    36     }
    37     if(!calc(0))
    38         puts("No Solution!");
    39     return 0;
    40 }
    View Code

    P152:最小重量机器设计问题

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int n,m,c;
     6 const int maxn = 100;
     7 
     8 struct Node {
     9     int w;
    10     int c;
    11     int id;
    12     bool operator < (const Node & rhs) const {
    13         if(w!=rhs.w)
    14             return w < rhs.w;
    15         else return c < rhs.c;
    16     }
    17 };
    18 
    19 vector<Node> nn[maxn];
    20 
    21 int ccc[maxn][maxn];
    22 int www[maxn][maxn];
    23 bool vis[maxn][maxn];
    24 
    25 bool calc(int cur,int cc) {
    26     if(cur>=n&&cc<=c) {
    27         printf("%d
    ",cc);
    28         for(int i=0;i<n;i++) {
    29             for(int j=0;j<m;j++) {
    30                 if(vis[i][j]) {
    31                     printf("%d ",nn[i][j].id);
    32                     break;
    33                 }
    34             }
    35         }
    36         puts("");
    37         return true;
    38     }
    39 
    40     else {
    41         for(int i=0;i<m;i++) {
    42             vis[cur][i] = true;
    43             int cx = cc+nn[cur][i].c;
    44             if(calc(cur+1,cx))
    45                 return true;
    46             vis[cur][i] = false;
    47         }
    48     }
    49     return false;
    50 }
    51 
    52 
    53 int main()
    54 {
    55     freopen("in.txt","r",stdin);
    56     scanf("%d%d%d",&n,&m,&c);
    57     for(int i=0;i<n;i++) {
    58         for(int j=0;j<m;j++) {
    59             scanf("%d",&ccc[i][j]);
    60         }
    61     }
    62 
    63     for(int i=0;i<n;i++) {
    64         for(int j=0;j<m;j++) {
    65             scanf("%d",&www[i][j]);
    66         }
    67     }
    68 
    69     for(int i=0;i<n;i++) {
    70         for(int j=0;j<m;j++) {
    71             nn[i].push_back((Node){www[i][j],ccc[i][j],j+1});
    72         }
    73         sort(nn[i].begin(),nn[i].end());
    74     }
    75 
    76     calc(0,0);
    77 
    78     return 0;
    79 }
    View Code

    P152:运动员最佳配对问题

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 const int maxn = 100;
     6 
     7 int n;
     8 int p[maxn][maxn];
     9 int q[maxn][maxn];
    10 bool vis[maxn];
    11 
    12 int ans;
    13 void calc(int cur,int cc) {
    14     if(cur>n) {
    15         ans = max(ans,cc);
    16     }
    17     for(int i=0;i<n;i++) {
    18         if(!vis[i]) {
    19             vis[i] = true;
    20             calc(cur+1,cc+p[cur][i]*q[i][cur]);
    21             vis[i] = false;
    22         }
    23     }
    24 }
    25 
    26 int main()
    27 {
    28     freopen("in.txt","r",stdin);
    29     scanf("%d",&n);
    30     for(int i=0;i<n;i++) {
    31         for(int j=0;j<n;j++) {
    32             scanf("%d",&p[i][j]);
    33         }
    34     }
    35     
    36     for(int i=0;i<n;i++) {
    37         for(int j=0;j<n;j++) {
    38             scanf("%d",&q[i][j]);
    39         }
    40     }
    41     
    42     calc(0,0);
    43     printf("%d
    ",ans);
    44     
    45     return 0;
    46 }
    View Code

    P196:n皇后问题

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 const int maxn = 25;
     6 int C[maxn];
     7 int n;
     8 void calc(int cur) {
     9     if(cur>=n) {
    10         for(int i=0;i<n;i++)
    11             printf("%d ",C[i]+1);
    12         puts("");
    13         return;
    14     }
    15     else {
    16         for(int i=0;i<n;i++) {
    17             int ok = 1;
    18             C[cur] = i;
    19             for(int j=0;j<cur;j++) {
    20                 if(C[cur]==C[j]||cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j]) {
    21                     ok = 0;
    22                     break;
    23                 }
    24             }
    25             if(ok) {
    26                 calc(cur+1);
    27                 return;
    28             }
    29         }
    30     }
    31     return;
    32 }
    33 
    34 int main()
    35 {
    36     scanf("%d",&n);
    37     calc(0);
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    Java & PHP RSA 互通密钥、签名、验签、加密、解密
    Spring Cloud:Security OAuth2 自定义异常响应
    Spring Cloud:统一异常处理
    Spring Cloud:多环境配置、eureka 安全认证、容器宿主机IP注册
    Hexo + GitEE 搭建、备份、恢复、多终端
    Spring:AOP面向切面编程
    如何找到适合自己的文档工具?
    比较好玩的工具类合集推荐!!!
    C++11 如何使代码仅执行一次?
    CMake 常用操作有哪些?
  • 原文地址:https://www.cnblogs.com/TreeDream/p/6759487.html
Copyright © 2020-2023  润新知