(递归)9278:旅行

描述

转眼毕业了,曾经朝夕相处的同学们不得不都各奔东西,大家都去了不同的城市开始新的生活。在各自城市居住了一段时间后,他们都感到了一些厌倦,想去看看其他人的生活究竟如何,于是他们都选择到另一个同学所在城市去旅游,并且希望旅游的城市各不相同,他们想知道有多少种不同的方案,可是数量实在太多了,他们无法计算出来,你能帮助他们吗。

输入

一个正整数n(n<200),表示人数。

输出

一个数,表示有多少不同的方案。

样例输入

3

样例输出

2

我の思考

这个题,很好思考,但是会超出范围,要用大数来解决。(今天事情做不完了QAQ,明天再来)

我の代码

#include <iostream>
using namespace std;

int carry(int n){
    if(n==1)
        return 0;

    if(n==2)
        return 1;

    return (n-1)*( carry(n-1) + carry(n-2) );
}

int main()
{
    int n;
    cin>>n;
    cout<<carry(n)<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
旅行商问题(TSP问题)是一个经典的组合优化问题,在计算机科学和数学领域都有广泛的研究。它的问题描述为:给定一组城市和每对城市之间的距离,求解访问每一座城市恰好一次并回到起始城市的最短回路。 以下是用C语言实现TSP问题的简单代码: ``` #include <stdio.h> #include <limits.h> #define V 4 // 图的顶点个数 int graph[V][V] = { // 图的邻接矩阵 { 0, 10, 15, 20 }, { 10, 0, 35, 25 }, { 15, 35, 0, 30 }, { 20, 25, 30, 0 } }; int visited[V] = {0}; // 记录每个节点是否被访问过 int path[V]; // 记录路径 int min(int a, int b) { return (a < b) ? a : b; } int tsp(int current) { int i, j; int min_path = INT_MAX; int temp_path; visited[current] = 1; path[0] = current; for (i = 0, j = 1; j < V; i++, j++) { int next; int min_distance = INT_MAX; for (int k = 0; k < V; k++) { if (!visited[k] && graph[current][k] < min_distance) { next = k; min_distance = graph[current][k]; } } temp_path = tsp(next); if (temp_path < min_path) { min_path = temp_path; for (int k = 0; k < V; k++) { path[k + 1] = path[k]; } path[0] = next; } visited[next] = 1; current = next; } return min_path + graph[current][path[0]]; } int main() { int result = tsp(0); printf("最短路径为: %d\n", result); printf("路径为: "); for (int i = 0; i < V; i++) { printf("%d ", path[i]); } printf("%d\n", path[0]); return 0; } ``` 该代码使用递归的方式实现了TSP问题的求解。在每一次递归中,找到与当前节点最近的未访问节点,并以该节点为起点继续递归,直到所有节点都被访问过为止。在回溯过程中,记录经过的路径,并计算路径长度。最终返回最短路径长度和路径本身。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值