Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstddef>
- #include <cstdint>
- #include <cstdio>
- #include <iostream>
- #include <vector>
- constexpr unsigned COINS[] = {1, 5, 16, 23, 33};
- constexpr unsigned COINS_CNT = sizeof(COINS) / sizeof(unsigned);
- unsigned greedy(unsigned amount) {
- unsigned cnt[COINS_CNT] = {0};
- for (int i = COINS_CNT - 1; i >= 0; i--) {
- cnt[i] = amount / COINS[i];
- amount %= COINS[i];
- }
- unsigned sum = 0;
- for (size_t i = 0; i < COINS_CNT; i++) {
- sum += cnt[i];
- printf("%u * %u\t", cnt[i], COINS[i]);
- }
- return sum;
- }
- std::pair<unsigned, std::vector<unsigned>>
- exhaustive_internal(unsigned amount, size_t coin_index) {
- unsigned coin = COINS[coin_index];
- unsigned max_cnt = amount / coin;
- unsigned min_cnt = UINT32_MAX;
- std::vector<unsigned> min_result;
- if (coin_index == 0) {
- if (amount % coin == 0) {
- return {max_cnt, {max_cnt}};
- } else {
- return {min_cnt, {}};
- }
- }
- for (size_t i = 0; i <= max_cnt; i++) {
- auto [min, result] =
- exhaustive_internal(amount - i * coin, coin_index - 1);
- if (min < min_cnt && min + i < min_cnt) {
- min_cnt = min + i;
- result.push_back(i);
- min_result = result;
- }
- }
- return {min_cnt, min_result};
- }
- unsigned exhaustive(unsigned amount) {
- auto [min, min_result] = exhaustive_internal(amount, COINS_CNT - 1);
- for (size_t i = 0; i < COINS_CNT; i++) {
- printf("%u * %u\t", min_result[i], COINS[i]);
- }
- return min;
- }
- int main() {
- for (unsigned amount = 1; amount < 100; amount++) {
- std::cout << "========== " << amount << " ==========" << std::endl;
- std::cout << greedy(amount) << std::endl;
- std::cout << exhaustive(amount) << std::endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement