实验五 回溯法

  • 第1关:排列
  • 第2关:子集合
  • 第3关:TSP问题
  • 第4关:n皇后问题
  • 第5关:0-1背包

第1关:排列

题目描述:

1.设计算法从前m个大写字母(m≤26)种取出n个字母的所有排列(组合),并编程实现

输入格式

输入M N
1<=M=26, N<=M

输出格式

按字典序输出排列
注意:行末不输出多余空格

测试输入:

4 2

预期输出:

A B
A C
A D
B A
B C
B D
C A
C B
C D
D A
D B
D C

分析:

  
代码实现:

#include<stdio.h>void Perm(int a[],int b[],int c[],int n,int m,int L){if(n==L){for(int i = 0; i <L; i++) {if(i==L-1){printf("%c\n",c[i]);}else{printf("%c ",c[i]);}}  return;}else{for(int i=0;i<m;i++){if(b[i]!=1){c[n]=a[i];b[i]=1;Perm(a,b,c,n+1,m,L);b[i]=0;}}}
}int main(){int m,n;scanf("%d %d",&m,&n);int a[m],b[m],c[n];for(int i=0;i<m;i++){a[i]='A'+i;b[i]=0;}Perm(a,b,c,0,m,n);return 0;
}

第2关:子集合

题目描述:

设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法?

输入格式

输入数据第1行有2个正整数n和c,n表示S的大小,c是子集和的目标值
接下来的1行中,有n个正整数,表示集合S中的元素
n<10,c<100

输出格式

输出所有满足条件的集合,当问题无解时,输出“No Solution!”。
注意:末尾不输出多余空格
按照输入顺序输出,比如第一个满足条件的子集合是[2 2 6],那么就先输出它,子集合内的数也按照输入顺序输出

测试输入:

5 10
2 2 6 5 4

预期输出:

2 2 6
6 4

分析:

代码实现:

#include<stdio.h>void Chir(int s[],int b[],int c,int m,int &count,int L){if(m==L){int a=0;for(int i=0;i<L;i++){if(a>c){break;}   if(b[i]==1){a+=s[i];}}if(a==c){int first =1;for(int i=0;i<L;i++){if(b[i]==1){  if(first){first = 0;}     else {printf(" ");}printf("%d",s[i]);}}printf("\n");count++;}return; }else{b[m]=1;Chir(s,b,c,m+1,count,L);b[m]=0;Chir(s,b,c,m+1,count,L);}
}int main(){int n,c,count=0;scanf("%d %d",&n,&c);int s[n],b[n];for(int i=0;i<n;i++){scanf("%d",&s[i]);b[n]=0;}Chir(s,b,c,0,count,n);if(count==0){printf("No Solution!"); }return 0;
}

第3关:TSP问题

题目描述:

输入格式

第一行输入n,代表有n个城市。
接下来n行每行输入n个数,第i行j列的值代表i市到j市的距离,0代表城市之间不通
注意:起点和终点都为1
n<7,城市之间的距离都不超过100

输出格式

第一行输出最少的旅行费用
第二行输入旅行路径
(保证只有一条最短旅行路径)

测试输入:

4
0 30 6 4
30 0 5 10
6 5 0 20
4 10 20 0

预期输出:

25
1 3 2 4 1

分析:

代码实现:

#include<stdio.h>
#include<stdlib.h>
#define inf 999999999void TspMin(int **city,int a[],int b[],int c[],int n,int &min,int len){if(n==len){int cost=0;for(int i=0;i<len;i++){if(city[a[i]-1][a[i+1]-1]!=0){cost+=city[a[i]-1][a[i+1]-1];}else{cost=inf;}  }if(cost<min){min=cost;for(int i=0;i<len+1;i++){b[i]=a[i];}}return;}else{for(int i=1;i<len;i++){if(c[i]!=1){a[n]=i+1;c[i]=1;TspMin(city,a,b,c,n+1,min,len);c[i]=0;}}}
}int main(){int n;scanf("%d",&n);int a[n+1],b[n+1],c[n];for(int i=0;i<n+1;i++){if(i==0||i==n){a[i]=1;}else{a[i]=0;}  }int **city=(int**)malloc(sizeof(int*)*n);for(int i=0;i<n;i++){city[i]=(int*)malloc(sizeof(int)*n);c[i]=0;}for(int i=0;i<n;i++){for(int j=0;j<n;j++){scanf("%d",&city[i][j]);}}int min=inf;TspMin(city,a,b,c,1,min,n);printf("%d\n",min);for(int i=0;i<n+1;i++){printf("%-2d",b[i]);}return 0;
}

第4关:n皇后问题

题目描述:

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

输入格式

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。。

输出格式

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

测试输入:

1
8
5
0

输出:

1
92
10

分析:

代码实现:

#include<stdio.h>void queen(int a[],int n,int &count,int len){if(n==len){bool flag=true;int i=n-1;for(int j=0;j<i;j++){if(a[i]==a[j]||a[j]-a[i]==j-i||a[j]-a[i]==i-j){flag=false;break;}}if(flag){count++;}return;}else{bool flag=false;int j=n-1;for(int k=0;k<j;k++){if(a[j]==a[k]||a[k]-a[j]==j-k||a[k]-a[j]==k-j){flag=true;break;}}for(int i=1;i<=len;i++){if(flag){break;}a[n]=i;queen(a,n+1,count,len);}}
}int main(){while(true){int n;scanf("%d",&n);if(n==0){break;}int a[n];for(int i=0;i<n;i++){a[i]=0;}int count=0;queen(a,0,count,n);printf("%d\n",count);}return 0;
}

第5关:0-1背包

题目描述:

给定n个物品和一背包,物品i的重量是wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?

输入格式

第一行输入n,c,分别代表物品的数量和背包的容量
第二行输入n个数 分别代表每个物品的重量
第三行输入n个数,分别代表每个物品的价值
1<n<10,1<c<100,重量不超过100,价值不超过1000

输出格式

输出一个数,代表能装入的最大价值

测试输入:

4 7
3 5 2 1
9 10 7 4

测试输出:

20

分析:

代码实现:

#include<stdio.h>void ValuesMax(int w[],int v[],int b[],int n,int c,int &max,int len){if(n==len){int weight=0,values=0;for(int i=0;i<len;i++){if(b[i]==1){weight+=w[i];values+=v[i];}}if(weight<=c){max=max>values?max:values;}return;}else{b[n]=1;ValuesMax(w,v,b,n+1,c,max,len);b[n]=0;ValuesMax(w,v,b,n+1,c,max,len);}
}int main(){int n,c;scanf("%d %d",&n,&c);int w[n],v[n],b[n]={0};for(int i=0;i<n;i++){scanf("%d",&w[i]);}for(int i=0;i<n;i++){scanf("%d",&v[i]);}int max=0;ValuesMax(w,v,b,0,c,max,n);printf("%d",max);return 0;
}

注:答案不唯一,仅供参考。分析后面有空写

educoder算法设计与分析 实验五回溯法相关推荐

  1. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  2. educoder算法设计与分析 实验一扩展 袋鼠过河问题

    实验五 回溯法扩展1 第1关:袋鼠过河问题 第1关:袋鼠过河问题 题目描述: 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩,每隔一米就有一个,每个桩上面有一个弹簧,袋鼠跳到弹簧上就可以跳 ...

  3. 算法设计与分析 实验五 算法综合实验

    实验5.<算法综合实验> 一.实验目的 理解和复习所学各种算法的概念 掌握和复习所学各种算法的基本要素 掌握各种算法的优点和区别 通过应用范例掌握选择最佳算法的设计技巧与策略 二.实验内 ...

  4. 【算法设计与分析】C++回溯法求全排列

    一.问题描述 设计一个算法求 1-n 的 n 个整数 中取出 m 个整数的全排列,要求在每个排列中每个整数只能取一次. 二.算法分析 直接使用深搜,个数满足了m就输出即可 #include<io ...

  5. 太原理工大学linux与python编程r实验报告_太原理工大学算法设计与分析实验报告...

    <太原理工大学算法设计与分析实验报告>由会员分享,可在线阅读,更多相关<太原理工大学算法设计与分析实验报告(12页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: ...

  6. 计算机算法设计与分析第五章思维导图知识点总结 ( 初稿 )

    复习链接 计算机算法设计与分析第一章思维导图 计算机算法设计与分析第二章思维导图&&知识点总结 计算机算法设计与分析第三章思维导图&&知识点总结 计算机算法设计与分析第 ...

  7. PHP第五周答案,算法设计与分析第五周作业——Word Ladder

    算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...

  8. 格雷码算法c语言实验报告,算法设计与分析实验报告

    本科生实验报告 课程名称:算法设计与分析 实验项目:递归和分治算法 实验地点:计算机系实验楼110 专业课:物联网1601学生.2016002105 学生姓名:于 指导员:郝晓丽 2018年5月4日 ...

  9. 算法设计与分析实验指导(完整版)

    算法设计与分析实验指导 文章目录 算法设计与分析实验指导 1. 快速排序及第k小数 1.1 快速排序 1.1.1 Implementation 1 1.1.2 算法特性分析 1.1.3 Improve ...

最新文章

  1. c# 返回一个对象实例的浅副本
  2. 第13章:项目合同管理(2)-章节重点
  3. html中简单轮播图实现原理,常见轮播效果及其实现原理
  4. 十八、深入Python函数
  5. 随机森林做特征重要性排序和特征选择
  6. android 最新 support,android support v7 下载-android support.v7包 官方最新版 - 河东下载站...
  7. 修改Typora的快捷键【markdown软件】
  8. VB6-改造ComUnit(免除用例名称注册)
  9. C# DataTable 用法简介
  10. 《中国人工智能学会通讯》——11.34 基于近似动态规划的优化控制研究及 在电力系统中的应用...
  11. shell脚本变量接收hive -e 返回值 “WARN:xxx...”
  12. SPSS学习 日记
  13. 奇虎360笔试题 挑选镇长
  14. 2021-2022 ICPC, NERC, Northern Eurasia Onsite C Connect the Points
  15. 面试题数组L型输出思路
  16. Unity3D编辑器插件开发
  17. 如何使用Couchbase实现文档版本控制
  18. 手把手讲解 Android Hook-Activity的启动流程
  19. DDD(领域驱动设计)分层架构
  20. 第19集丨本来无一物,何处惹尘埃

热门文章

  1. hue源码编译,替换cloudera manage hue,解决hue滚动条bug问题
  2. 卿斯汉:重视云安全 发展云计算
  3. 2021年山东大学程序设计精英挑战赛 真题
  4. 超级账本Fabric 2.x 详细安装步骤及可能问题解决方式
  5. gitbook生成pdf时缺少ebook.css解决方案
  6. 第四次团队作业:社团申请App
  7. 弘辽科技:淘宝有哪些推广工具?有哪些店铺推广方法?
  8. 支付宝小程序云开发(Serverless)
  9. java-net-php-python-jsp家具进销存管理系统1计算机毕业设计程序
  10. 京东数科开源区块链底层引擎JD Chain,区块链已成其第四大核心技术