问题引入
**用动态规划求解设备更新问题 **
某人打算购买一辆新的小货车用于运货,货车的售价是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完事了~如果有算法改进的地方可以在评论区讨论一下,一起学习。