C++ 设置数字时钟计时器的最低成本与给定的移动和推动成本
使用给定的移动和推动成本来设置数字时钟计时器可以是一项具有挑战性的任务。在采取适当的方法并理解相关的语法和算法时,降低设置数字时钟计时器相关成本是可行的。通过本文,我们将分析语法和算法,同时提供两种使用C++实现最小成本的替代技术。
语法
为了确保成功理解后续的代码示例,建议首先掌握所使用的语法,然后再探索算法和方法:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Function declarations (if necessary)
int main() {
// Variable declarations and initializations
// Code logic
return 0;
}
步骤
为了实现最小成本,我们需要找到最优的移动和推动数字时钟计时器的顺序。以下是计算最小成本的逐步算法:
- 读取每个数字的移动成本,并将其存储在向量中。
-
读取每个数字的推动成本,并将其存储在另一个向量中。
-
读取要设置在数字时钟计时器上的目标时间。
-
初始化一个大小为
(目标时间 + 1)的动态规划表,用于存储每个时间值的最小成本。 -
将表中的初始值设置为无穷大或一个较大的值,除了第0行,该行应设置为0。
-
对于目标时间中的每个数字,迭代遍历所有可能的值0至9。
-
对于每个值,计算当前数字的移动和推动成本。
-
使用当前移动成本、推动成本和先前数字的最小成本的总和,更新动态规划表中的最小成本。
-
最后,目标时间的最小成本将存储在动态规划表的最后位置。
方法
有两种方法可以解决这个问题——递归方法和动态规划方法。对这两种方法进行详细审查将是有益的。
方法1:递归方法
在递归方法中,我们将定义一个递归函数来计算最小成本。该函数将使用当前时间、移动成本、推动成本和当前数字索引作为参数。递归方法涉及重复计算每个可用数字的最小可能值,然后确定哪个是真正的最优解。
示例
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int calculateMinimumCostRecursive(vector<int> movement, vector<int> push, int targetTime, int currentDigit) {
if (currentDigit < 0)
return 0;
int minCost = INT_MAX;
for (int i = 0; i <= 9; i++) {
int cost = movement[currentDigit] * i + push[currentDigit] + calculateMinimumCostRecursive(movement, push, targetTime / 10, currentDigit - 1);
minCost = min(minCost, cost);
}
return minCost;
}
int main() {
// Example usage
vector<int> movement = {5, 4, 3, 2, 1}; // Movement cost for each digit
vector<int> push = {1, 2, 3, 4, 5}; // Push cost for each digit
int targetTime = 12345; // Target time to set
int minimumCostRecursive = calculateMinimumCostRecursive(movement, push, targetTime, movement.size() - 1);
cout << "Minimum cost (Recursive): " << minimumCostRecursive << endl;
return 0;
}
输出
Minimum cost (Recursive): 15
在这段代码中,我们定义了calculateMinimumCostRecursive函数,它接受移动成本、推动成本、目标时间和当前数字作为参数。在函数内部,我们检查当前数字小于0的基本情况。在递归情况下,我们迭代当前数字的所有可能值,并通过考虑移动成本、推动成本和递归调用下一个数字的函数来计算成本。我们跟踪最小成本并将其作为结果返回。
方法2:动态规划方法
在动态规划方法中,我们将利用算法部分提到的动态规划表。我们将遍历目标时间的各个数字,计算每个数字值的最小成本,并相应地更新动态规划表。最后,在表中保存的数据中返回最小可行成本,完成我们的分析。
示例
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int calculateMinimumCostDynamic(vector<int> movement, vector<int> push, int targetTime) {
int n = movement.size();
vector<int> dp(targetTime + 1, INT_MAX);
dp[0] = 0;
for (int i = 0; i < n; i++) {
for (int j = movement[i]; j <= targetTime; j++) {
dp[j] = min(dp[j], movement[i] * (j / movement[i]) + push[i] + dp[j % movement[i]]);
}
}
return dp[targetTime];
}
int main() {
// Example usage
vector<int> movement = {5, 4, 3, 2, 1}; // Movement cost for each digit
vector<int> push = {1, 2, 3, 4, 5}; // Push cost for each digit
int targetTime = 12345; // Target time to set
int minimumCostDynamic = calculateMinimumCostDynamic(movement, push, targetTime);
cout << "Minimum cost (Dynamic Programming): " << minimumCostDynamic << endl;
return 0;
}
输出
Minimum cost (Dynamic Programming): -2147471303
在这段代码中,我们定义了calculateMinimumCostDynamic函数,它接受运动成本、推动成本和目标时间作为参数。我们用大小为(targetTime + 1)的动态规划表dp进行初始化,并将所有值设置为一个大的值,除了第0个位置,它被设置为0。然后我们遍历每个数字和每个时间值,从运动成本递增到目标时间。在每次迭代中,我们通过考虑运动成本、推动成本和前一个数字获得的最小成本来计算最小成本。我们使用最小成本更新动态规划表中的每个时间值。
结论
通过给定的运动成本和推动成本来设置一个数字时钟计时器可以进行优化以实现最小成本。在本文中,我们探讨了语法、算法和计算最小成本的两种不同方法。递归方法提供了一种简单直接的解决方案,而动态规划方法则通过使用表格来优化计算时间。通过在您的代码中实现这些方法,您可以在最小化相关成本的同时高效地设置一个数字时钟计时器。
极客笔记