游艇出租问题

长江游艇俱乐部在长江上设置了n个游艇出租站1,2,3…,n。游客可以在这些游艇出租站用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j=n。试设计一个算法,计算从游艇出租站1到出租站n所需的最少租金。

输入描述:第一行表示有n个站点,接下来n-1行是r( i ,  j)。

输出描述:输出从游艇出租站1到出租站3所需的最少租金

样例输入:

    3            //站数

    5  15     //从第1站到其他相应各站的租金

    7           //从第2站到其他相应各站的租金

样例输出:

               12

c语言完整代码

#include <stdio.h>
#include <stdbool.h>
#define MAXN 1001
#define INF 1<<30
int r[MAXN][MAXN]; // r[i][j]表示从节点i到节点j的距离(租金)
int dist[MAXN]; // dist[i]表示源点到节点i的最短距离
bool vis[MAXN]; // vis[i]表示节点i是否已经加入已确定最短路径的节点集合P
// dijkstra算法
int dijkstra(int n) {
    int i, j, k;
    for (i = 2; i <= n; i++)
        dist[i] = r[1][i]; // 初始化源点到各个节点的距离为r(1,i)
    for (i = 2; i <= n; i++)
        vis[i] = false; // 初始化所有节点还没有被访问过
    vis[1] = true; // 源点已经访问过了
    int cnt = 1; 
    while (cnt < n) { // 进行n-1次循环
        int minDist = INF;
        for (i = 2; i <= n; i++) { // 找出源点到未访问的节点中距离最小的节点k
            if (!vis[i] && dist[i] < minDist) {
                minDist = dist[i];
                k = i;
            }
        }         
        vis[k] = true; // 标记节点k已经被访问过了
        cnt++; // 访问节点数加1
        for (i = 1; i <= n; i++) { // 更新现有距离
            if (!vis[i] && dist[i] > dist[k] + r[k][i])
                dist[i] = dist[k] + r[k][i]; } }
    return dist[n]; // 返回源点到n节点的最短路径长度
}
int main() {
    int n;
    int k;
    printf("请输入总站数:\n");
    scanf("%d", &n);
    for (int i = 1; i < n; i++){
    	printf("请输入第%d站到后面各站的距离:\n",i);
        for (int j = i+1; j <= n; j++) {
            if (j == i+1){
			for(k=i+1;k<=n;k++)
			 scanf("%d", &r[i][k]); // 输入第i个站到第j个站之间的租金
			 r[k][i] = r[i][k]; 
			 	}} }
    printf("第1站到第%d站的最小距离为:\n",n);
    printf("%d\n", dijkstra(n));
    return 0;
}

输入输出示例

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用\[1\]和引用\[2\]提供了关于长江游艇租赁问题的描述,其中游艇出租i到j之间的租金为rent(i,j)或r(i,j)。这个问题可以使用动态规划算法来解决。动态规划是一种通过将问题分解为子问题并利用子问题的解来求解原问题的方法。 在这个问题中,我们可以定义一个二维数组dp,其中dp\[i\]\[j\]表示从出租1到出租j所需要的最少租金。我们可以使用以下递推关系来计算dp\[i\]\[j\]的值: dp\[i\]\[j\] = min(dp\[i\]\[k\] + dp\[k\]\[j\] + rent(i,k) + rent(k,j)),其中i < k < j 这个递推关系表示从出租i到出租j的最少租金可以通过从出租i到出租k的最少租金、从出租k到出租j的最少租金以及从出租i到出租k和从出租k到出租j之间的租金之和来计算得到。 根据这个递推关系,我们可以使用动态规划算法来计算从出租1到出租n所需要的最少租金。具体的算法步骤如下: 1. 创建一个二维数组dp,大小为n x n,初始化所有元素为无穷大。 2. 设置dp\[i\]\[i\]为0,表示从出租i到出租i的最少租金为0。 3. 对于每个长度为l的子问题,从长度为2开始,逐步增加长度,直到长度为n。 4. 对于每个子问题,遍历所有可能的起始出租i和结束出租j的组合。 5. 对于每个组合,遍历所有可能的中间出租k,计算dp\[i\]\[j\]的值。 6. 根据递推关系,更新dp\[i\]\[j\]的值为min(dp\[i\]\[j\], dp\[i\]\[k\] + dp\[k\]\[j\] + rent(i,k) + rent(k,j))。 7. 最终,dp\[1\]\[n\]的值即为从出租1到出租n所需要的最少租金。 这样,我们就可以使用动态规划算法来解决游艇租赁问题,计算出从出租1到出租n所需要的最少租金。 #### 引用[.reference_title] - *1* [动态规划:游艇租用问题](https://blog.csdn.net/Artprog/article/details/49886021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [租用游艇问题(暴力法/动态规划)](https://blog.csdn.net/qq_31747473/article/details/109234532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [动态规划——游艇租赁问题](https://blog.csdn.net/weixin_42329007/article/details/112794504)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值