算法设计与分析课程设计——NEFU

分治法——整数分解

整数分解

// 递归法
#include <iostream>
using namespace std;


int solve(int n)
{
	int ans = 1, i;				// ans = 1初始表示n = n的情况
	for (i=2; i*i < n; i++)		// 因子乘因子小于n,可能被整除
		if (n % i == 0)		    // i 是 n的因子, n / i也是n的因子
			ans += solve(i) + solve(n / i);
	if (i * i == n)				// i是n的因子, 并且i * i == n时只有这一种情况, 左右交换也是一种
		ans += solve(i);
	return ans;
}

int main()
{
	int n;
	while(cin>>n)
  		cout<<n<<" have "<<solve(n)<<" solutions"<<endl;
	return 0;
}


动态规划

爬楼梯
在这里插入图片描述

#include <iostream>
using namespace std;


int climbStairs(int n) 
{
    if(n==1 || n==2 || n==3)
        return n;
    else
        return climbStairs(n-1)+climbStairs(n-2);
}

int main()
{
  int n;
  cin>>n;
  cout<<climbStairs(n)<<endl;
  return 0;

}

矩阵最短路径

#include <iostream>
using namespace std;
int dp[100][100];
int m[5][5] =   {{0,0,0,0,0},
                {0,1,3,5,9},
                {0,8,1,3,5},
                {0,5,0,6,1},
                {0,8,8,4,0}};//题目中的矩阵

int main()
{
    int n;
    int i,j;
    n=4;
    dp[0][0] = 0;
	for(i=1;i<=n;i++) 
    {
		for (j=1;j<=n;j++) 
        {
			if(i==1)//在第一行,上一不一定是从左边
            {
                dp[i][j] = dp[i][j-1]+m[i][j];
            }else if(j==1)//在第一列,上一步一定是上边
            {
                dp[i][j] = dp[i-1][j] +m[i][j];
            }else//可能向右,可能向左
            {
                dp[i][j]=min(dp[i][j-1]+m[i][j],dp[i-1][j] +m[i][j]);
            }
      }
    }
    cout<<dp[n][n];
}

贪心算法

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

#include<bits/stdc++.h>
using namespace std;

int main()
{
   int n;  
   cin >> n;
   int F[n+1];
   for(int i=1;i<=n;i++)
      cin>>F[i];
   int i;
   for(i=1;i<n;i++)
   {
      sort(F+i,F+n+1);
      cout<<"After sort :";
      for(int k=i;k<=n;k++)
         cout<<F[k]<<" ";
      cout<<endl;
      F[i+1]+=F[i];
      cout<<"After Merge:";
      for(int k=i+1;k<=n;k++)
         cout<<F[k]<<" ";
      cout<<endl;
      
   }
   return 0;
}
/*
6
10 5 100 50 20 15
*/


素数环——回溯法

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int n=0;
int a[20];
int  x[20];
int sum=0;

bool isp(int n)
{
	if(n==1)
		return false ;
	if(n==2)
		return true;
	int len=(int)sqrt(n+0.0);
	for (int i=2;i<=len;i++)
	{
		if(n%i==0)
			return false ;
	}
	return true;
}


void Backtrack(int t)
{
	if(t==n&&isp(a[0]+a[n-1]))
    {
		sum++;
		for (int i=0;i<n;i++)
			cout<<a[i]<<' ';
		cout<<endl;
		return ;
	}
	//前n-1层执行,递归选定每一层的整数,使其与前一层的整数之和为素数
	else 
        for (int i=2;i<=n;i++)
        {
		    if(!x[i]&&isp(i+a[t-1]))
            {	//当前值i没被使用,且与前一个选定值之和为素数
			    a[t]=i;
			    x[i]=1;
			    Backtrack(t+1);
			    x[i]=0;
		    }
	    }
}
 
int main()
{
	for (int i=0;i<20;i++)
		a[i]=i+1;//初始化一个数组1,2,3,4...
	memset(x,0,sizeof(x));//全部初始化为false表示均没被使用
	while(cin>>n)
	{
		Backtrack(1);
		cout<<"sum:"<<sum<<endl;
	}//回溯法遍历解答树,输出所有素数环

}

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值