CodeChef 和 CodeForces 上的最小硬币找零问题(动态编程实现)超过时间限制
Time limit exceeded on minimum coin change problem(Dynamic Programming Implementation) on CodeChef and CodeForces
我在 CodeChef 和 CodeForces 上遇到了最小硬币找零的问题。在这两个站点上,我都使用 DP 提交了我的实现。此实现在两个站点上都给出了 TLE 错误。
不幸的是,我找不到这个问题的任何其他实现。
我正在联系问题 -
CodeChef-https://www.codechef.com/problems/FLOW005
CodeForces - https://codeforces.com/problemset/problem/996/A
这是我的代码(CodeChef 实现)-
int main() {
int T{};
std::cin >> T;
for (int i = 1; i <= T; ++i) {
int N{};
std::cin >> N;
std::vector <int> arr(N + 1);
for (int i = 0; i < N + 1; ++i) {
arr[i] = minCoins(i, arr);
}
std::cout << arr[N] << std::endl;
}
return 0;
}
minCoins 函数 -
int minCoins(int x, std::vector <int> arr) {
if (x == 0)
return 0;
else if (x == 1 || x == 2 || x == 5 || x == 10 || x == 50 || x == 100)
return 1;
int min{ 1 + arr[x - 1]};
if (x > 100)
min = std::min(min, l + arr[x - 100]);
if (x > 50)
min = std::min(min, 1 + arr[x - 50]);
if (x > 10)
min = std::min(min, 1 + arr[x - 10]);
if (x > 5)
min = std::min(min, 1 + arr[x - 5]);
if (x > 2)
min = std::min(min, 1 + arr[x - 2]);
if (x > 1)
min = std::min(min, 1 + arr[x - 1]);
return min;
}
阅读约束后选择了int数据类型,不存在整数溢出问题。
另外,如果有人想建议我如何删除 if 梯子并用更简单的东西替换它,我将不胜感激。另外,感谢您花时间阅读我的问题:)
#include <iostream>
int main() {
int tests;
std::cin >> tests;
int value;
while (tests--) {
int coinCount = 0;
std::cin >> value;
while (value > 0) {
if (value >= 100) {
coinCount += (value / 100);
value %= 100;
} else if (value >= 50) {
coinCount += (value / 50);
value %= 50;
} else if (value >= 10) {
coinCount += (value / 10);
value %= 10;
} else if (value >= 5) {
coinCount += (value / 5);
value %= 5;
} else if (value >= 2) {
coinCount += (value / 2);
value %= 2;
} else if (value >= 1) {
coinCount += (value / 1);
value = 0;
}
}
std::cout << coinCount << '\n';
}
}
在 CodeChef 上测试并通过,执行时间为 0.00。问题中显示的货币系统的设计方式使得贪心选择是正确的选择。这适用于几乎所有现有货币系统。
如果您需要证明,http://www.cs.toronto.edu/~denisp/csc373/docs/greedy-coin-change.pdf
我在 CodeChef 和 CodeForces 上遇到了最小硬币找零的问题。在这两个站点上,我都使用 DP 提交了我的实现。此实现在两个站点上都给出了 TLE 错误。
不幸的是,我找不到这个问题的任何其他实现。
我正在联系问题 -
CodeChef-https://www.codechef.com/problems/FLOW005
CodeForces - https://codeforces.com/problemset/problem/996/A
这是我的代码(CodeChef 实现)-
int main() {
int T{};
std::cin >> T;
for (int i = 1; i <= T; ++i) {
int N{};
std::cin >> N;
std::vector <int> arr(N + 1);
for (int i = 0; i < N + 1; ++i) {
arr[i] = minCoins(i, arr);
}
std::cout << arr[N] << std::endl;
}
return 0;
}
minCoins 函数 -
int minCoins(int x, std::vector <int> arr) {
if (x == 0)
return 0;
else if (x == 1 || x == 2 || x == 5 || x == 10 || x == 50 || x == 100)
return 1;
int min{ 1 + arr[x - 1]};
if (x > 100)
min = std::min(min, l + arr[x - 100]);
if (x > 50)
min = std::min(min, 1 + arr[x - 50]);
if (x > 10)
min = std::min(min, 1 + arr[x - 10]);
if (x > 5)
min = std::min(min, 1 + arr[x - 5]);
if (x > 2)
min = std::min(min, 1 + arr[x - 2]);
if (x > 1)
min = std::min(min, 1 + arr[x - 1]);
return min;
}
阅读约束后选择了int数据类型,不存在整数溢出问题。 另外,如果有人想建议我如何删除 if 梯子并用更简单的东西替换它,我将不胜感激。另外,感谢您花时间阅读我的问题:)
#include <iostream>
int main() {
int tests;
std::cin >> tests;
int value;
while (tests--) {
int coinCount = 0;
std::cin >> value;
while (value > 0) {
if (value >= 100) {
coinCount += (value / 100);
value %= 100;
} else if (value >= 50) {
coinCount += (value / 50);
value %= 50;
} else if (value >= 10) {
coinCount += (value / 10);
value %= 10;
} else if (value >= 5) {
coinCount += (value / 5);
value %= 5;
} else if (value >= 2) {
coinCount += (value / 2);
value %= 2;
} else if (value >= 1) {
coinCount += (value / 1);
value = 0;
}
}
std::cout << coinCount << '\n';
}
}
在 CodeChef 上测试并通过,执行时间为 0.00。问题中显示的货币系统的设计方式使得贪心选择是正确的选择。这适用于几乎所有现有货币系统。
如果您需要证明,http://www.cs.toronto.edu/~denisp/csc373/docs/greedy-coin-change.pdf