当前位置:   article > 正文

算法设计与分析课设_算法设计与分析课程设计题目

算法设计与分析课程设计题目

前言:没时间写,只写了写代码,不能保证全对,挑的题也都是简单的。回溯的题自己写的不对,找的别人的写了下

分治:

3、整数因子分解

大于1的正整数n可以分解为:n=x1×x2×……×xm。

例如,当n=12时,共有8种不同的分解式:

12=12

12=6×2

12=4×3

12=3×4

12=3×2×2

12=2×6

12=2×3×2

12=2×2×3

输入:

数据有多行,给定正整数(正整数小于10000000)

输出: 

每个数据输出一行,是正整数n的不同分解式数量。

输入样例

12

35

输出样例

8

3

  1. #include<iostream>
  2. #include<stdio.h>
  3. using namespace std;
  4. int resolve(int n)
  5. {
  6. int count = 1, i; // ans = 1初始表示n = n的情况
  7. for (i = 2; i * i < n; i++){
  8. if (n % i == 0) // i 是 n的因子, n / i也是n的因子
  9. count += resolve(i) +resolve(n / i);
  10. }
  11. if (i * i == n) // i是n的因子, 并且i * i == n时只有这一种情况, 左右交换也是一种
  12. count += resolve(i);
  13. return count;
  14. }
  15. int main()
  16. {
  17. int n;
  18. while(scanf("%d",&n)!=-1){
  19. cout<<resolve(n);
  20. }
  21. return 0;
  22. }

动态规划

4、台阶问题

问题描述:有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法。

实际情况:给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置,路径中所有数字累加起来就是路径和,返回所有路径的最小路径和,如果给定的m如下,那么路径1,3,1,0,6,1,0就是最小路径和,返回12.

1 3 5 9

8 1 3 4

5 0 6 1

8 8 4 0

 

 

  1. #include<iostream>
  2. using namespace std;
  3. const int N=10;
  4. int m[N][N];
  5. int main(){
  6. int n;
  7. cin>>n;
  8. for(int i=0;i<n;i++){
  9. for(int j=0;j<n;j++){
  10. cin>>m[i][j];
  11. }
  12. }
  13. int dp[n][n]={0};
  14. for(int i=0;i<n;i++){
  15. for(int j=0;j<n;j++){
  16. dp[i][j]=m[i][j];
  17. }
  18. }
  19. for(int i=1;i<n;i++){
  20. dp[i][0]+=dp[i-1][0];
  21. }
  22. for(int j=1;j<n;j++){
  23. dp[0][j]+=dp[0][j-1];
  24. }
  25. for(int i=1;i<n;i++){
  26. for(int j=1;j<n;j++){
  27. dp[i][j]+=min(dp[i-1][j],dp[i][j-1]);
  28. }
  29. }
  30. cout<<dp[n-1][n-1]<<endl;
  31. int i=0,j=0;
  32. cout<<m[i][j]<<" ";
  33. while(true){
  34. if(i==n-1&&j==n-1){
  35. break;
  36. }
  37. if(dp[i+1][j]>dp[i][j+1]){
  38. cout<<m[i][j+1]<<" ";
  39. j++;
  40. }
  41. else{
  42. cout<<m[i+1][j]<<" ";
  43. i++;
  44. }
  45. }
  46. }
  47. // 1 3 5 9
  48. // 8 1 3 4
  49. // 5 0 6 1
  50. // 8 8 4 0

贪心

1、文件连接问题:给定一个大小为n的数组F,数组元素F[i]表示第i个文件的长度。现在需要将所有文件合并成一个文件,文件越长后面连接成新文件花费的时间越长,试给出贪心算法给出文件连接顺序,保证连接文件花费的时间最短。 

  1. #include<iostream>
  2. #include<cmath>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=100;
  6. // 文件连接问题:给定一个大小为n的数组F,数组元素F[i]表示第i个文件的长度。
  7. // 现在需要将所有文件合并成一个文件,
  8. // 文件越长后面连接成新文件花费的时间越长,试给出贪心算法给出文件连接顺序,
  9. // 保证连接文件花费的时间最短。
  10. int main(){
  11. int n;
  12. cin>>n;
  13. int F[N],P[N];
  14. for(int i=0;i<n;i++){
  15. cin>>F[i];
  16. }
  17. for(int i=0;i<n;i++){
  18. P[i]=F[i];
  19. }
  20. sort(P,P+n);
  21. for(int i=0;i<n;i++){
  22. for(int j=0;j<n;j++){
  23. if(P[i]==F[j]){
  24. cout<<j+1<<" ";
  25. }
  26. }
  27. }
  28. }
  29. // 5 8 1 3 4 9

 

回溯:

1、素数环问题

(1)问题描述:输入正整数n,把整数1,2,3,4…..n组成一个环,使得相邻的两个整数之和均为素数。

(2)样例

输入:

6

输出:

1 4 3 2 5 6

1 6 5 2 3 4

(3)提示:n=4时的搜索解空间树。

 

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int n=0;
  5. const int N=105;
  6. int a[N]; //对应环
  7. int visit[N]={-1}; //标记数组 0表示未用 1表示已用
  8. int check(int k) //判断数字x是否为素数
  9. {
  10. int i,n;
  11. n=(int)sqrt(k);
  12. for(i=2;i<=n;i++)
  13. if(k%i==0) return 0;
  14. return 1;
  15. }
  16. void dfs(int step)
  17. {
  18. if(step==n&&check(a[0]+a[n-1])==1) //全部填满而且第一个元素和最后一个元素满足就输出
  19. {
  20. for(int i=0;i<n;i++)
  21. cout<<a[i]<<" ";
  22. cout<<endl;
  23. return ;
  24. }
  25. else
  26. {
  27. for(int i=2;i<=n;i++)
  28. {
  29. if(visit[i]==0&&check(i+a[step-1])==1){ //i没有被占用且与前一个元素符合
  30. a[step]=i;
  31. visit[i]=1;
  32. dfs(step+1);
  33. visit[i]=0;
  34. }
  35. }
  36. }
  37. }
  38. int main(void)
  39. {
  40. cin>>n;
  41. a[0]=1; //因为是环所以第一个元素固定
  42. visit[1]=1; //1已用
  43. dfs(1); //从第一个元素开始
  44. return 0;
  45. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/891007
推荐阅读
相关标签
  

闽ICP备14008679号