动态规划求解设备更新问题

问题引入

**用动态规划求解设备更新问题 **
某人打算购买一辆新的小货车用于运货,货车的售价是22 万元人民币。货车购买后,每年的各种保险费、养护费等费用如下表:
在这里插入图片描述
设计一种购买货车的方案,使5 年内用车的总费用最少。
选作:将其中所有的数据,包括售价、年份、各年份的费用和各年份二手车销售价等的数据改为任意值。

设计思路

利用动态规划的思想,将每年用车的费用记录下来,然后利用递归在权重数组中找最优的。
细节直接见代码,我都写上了注释


代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<limits.h>
using namespace std;

//算法思路:动态规划,dp[i]=dp[i-1]+fee[i]
//把n年内用车总费用各自求出来
///
//第一年把车卖了,第二年就还是要继续算法,之前没注意这个问题写的时候总是第一年卖最划算,在买车卖车中反复横跳了~~
double dynamic(int t, double weight[], double dp[], double& cost) {
	if (t == 0) {
		return 0;
	}//第0年售出没有意义
	else if (t == 1) {
		cout << "1年后卖" << endl;
		cost = cost + weight[0];
		return weight[0];
	}//递归出口
	else {
		double value = weight[0];
		int y = 0;
		for (int i = 1; i <= t - 1; i++) {
			if (weight[i] <= value) {
				value = weight[i];
				y = i;
			}
		}//用于遍历所有的方案,找出最低成本的方案并记录年数
		cout << y + 1 << "年后卖" << endl;
		cost += dp[y];
		return dp[y] + dynamic(t - y - 1, weight, dp, cost);
	}
}

bool solve(int upkeep[], int sell[], int newcar, int year) {

	int allinupkeep[5] = { 0 };//allinupkeep用来记录车龄为i的总养护费
	double dp[5];//dp[i]表示i年内用车的费用
	double weight[5];//weight[i]表示第i年出售的每年平均费用
	double cost = 0;//cost用于记录总成本

	//由题,dp[i]=newcar-sell[i] + allinupkeep[i]

	for (int i = 0; i < 5; i++)//i用来记录车龄
	{
		for (int j = 0; j <= i; j++) //j用来遍历i一下的年数
		{
			allinupkeep[i] += upkeep[j];
		}

		dp[i] = newcar - sell[i] + allinupkeep[i];//求出第几年卖出需要多少成本
	}

	for (int i = 0; i < 5; i++) {
		weight[i] = dp[i] / (i + 1);
	}//用于求每年的平均权重
	cout << "5年内的用车方案可为:" << endl;
	dynamic(year, weight, dp, cost);//递归算法求哪一年出售成本最低
	cout << "5年用车成本最低为 " << cost << " 万元 " << endl;
	return true;
}

bool uI() {
	int upkeep[5] = { 3,5,10,16,21 };//upkeep[i]表示车龄为i的养护费
	int sell[5] = { 17,15,7,4,2 };//sell[i]表示车龄为i的出售价
	int newcar = 22;
	int year = 5;
	/*
	for (int i = 0; i < 5; i++) {
		cout << "请输入车龄为"<<i <<"的养护费"<< endl;
		cin >> upkeep[i];
	}
	for (int i = 0; i < 5; i++) {
		cout << "请输入车龄为" << i << "的出售价" << endl;
		cin >> sell[i];
	}
	
	cout << "请输入买一辆新车的价格" << endl;
	cin >> newcar;
	
	cout << "请输入一共使用时长" << endl;
	cin >> year;
	*/
	solve(upkeep, sell, newcar, year);
	return 1;
}

int main() {
	uI();
}


我写的代码本来是打算参考求解设备更新问题的代码,但是细看他的代码有很多问题。
题目要求每次买的是新车,不是二手车。在网上看代码还是需要带入自己的思考的,这也是学习的过程,在网上找源码也只是减少走弯路而不是做CP完事了~如果有算法改进的地方可以在评论区讨论一下,一起学习。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertOS

还会有大爷会打钱?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值