动态规划——游艇租用问题(c++)

游艇租用问题

问题描述
长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1i<jn。试设计一个算法,计算出从游艇出租站1到游艇出租站n所需的最少租金。
编程任务
对于给定的游艇出租站i到游艇出租站j之间的租金为r(i,j),1i<jn,编程计算从游艇出租站1到游艇出租站n所需的最少租金。
数据输入
由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示有n个游艇出租站。接下来的n-1行是r(i,j),1i<jn。
(例如:
3
5 15
7
表示一共有3个出租站点,其中
第1个站点到第2个的租金为5
第1个站点到第3个的租金为15
第2个站点到第3个的租金为7
)
结果输出
程序运行结束时,将计算出的从游艇出租站1到游艇出租站n所需的最少租金输出到文件output.txt中。

输入文件示例输出文件示例
input.txtoutput.txt
312
5 15
7
input.txtoutput.txt
415
3 7 19
5 13
8

c++代码

#include<iostream>
#include<ctime>
#include<cstdlib>
#pragma warning(disable:4996)
using namespace std;

int func(int **r,int n) {
	int x[2];                           //定义2个数x[0]储存n-1和n站的最少租金
	x[0] = r[0][1];
	for (int i = 2; i < n; i++) {
		int a = r[0][i];                //从起点到n站需要的租金
		int b = x[0] + r[i-1][i];		//从n-1站到n站需要的租金
		x[1] = a < b ? a : b;           //从a、b中取最小值
		x[0] = x[1];                    
	}
	return x[1];                          //返回第n站的最小租金
}

int main() {
	int n;
	if (freopen("C:\\Users\\11590\\Desktop\\input.txt", "r", stdin) == NULL)
		cout << "输入文件打开失败" << endl;
	cin >> n;
	int** r = new int* [n];
	for (int i = 0; i < n; i++) {
		r[i]= new int[n];
	}
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++)
			cin >> r[i][j];
	if (freopen("C:\\Users\\11590\\Desktop\\output.txt", "w", stdout) == NULL)
		cout << "输出文件打开失败" << endl;
	cout <<func(r,n)<< endl;
	for (int i = 0; i < n; i++) {
		delete[]r[i];
	}
	delete[]r;
	fclose(stdin);
	fclose(stdout);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为你讲解一下如何用动态规划算法来解决“游艇租用问题,并提供一个C++代码示例。 首先,我们需要明确问题的具体描述:有一家游艇出租公司,提供两种型号的游艇,每种游艇的租金和载客量都不同。假设有n个人要租船出海,选择租用哪种游艇并且出海的时间长短也不同,求最大收益。 接下来,我们可以根据题目所给的数据,使用动态规划算法来解决这个问题。具体步骤如下: 1. 定义状态:我们可以定义一个二维数组dp[i][j],其中i表示租用i艘游艇,j表示租用的总时间。dp[i][j]表示在租用i艘游艇,总租用时间为j的情况下,能够获得的最大收益。 2. 初始化:当租用游艇的数量为0时,最大收益为0,即dp[0][j] = 0;当租用时间为0时,最大收益也为0,即dp[i][0] = 0。 3. 状态转移方程:我们可以根据题意,得到状态转移方程为: dp[i][j] = max(dp[i][j], dp[i-1][j-k] + f[i][k]) 其中,f[i][k]表示租用i艘游艇租用时间为k的情况下能够获得的最大收益。 4. 最终结果:最终结果即为dp[n][T],其中n表示租用n艘游艇,T表示总租用时间。 下面是一个C++代码示例,实现了“游艇租用问题动态规划算法求解: ```cpp #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N = 20, M = 10010; int n, m; int f[N][M]; int w[N], v[N]; int main() { cin >> n >> m; for (int i = 1; i <= n; i ++ ) cin >> w[i] >> v[i]; for (int i = 1; i <= n; i ++ ) for (int j = w[i]; j <= m; j ++ ) f[i][j] = max(f[i][j], f[i][j - w[i]] + v[i]); cout << f[n][m] << endl; return 0; } ``` 这个代码示例中,我们先输入了n个人要租船出海的情况,然后使用动态规划算法求解最大收益,并输出最终结果。 希望我的回答对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值