Home > Backend Development > C++ > C++ program: Calculate the number of operations required to reach n using coin payments

C++ program: Calculate the number of operations required to reach n using coin payments

WBOY
Release: 2023-09-14 20:53:04
forward
1209 people have browsed it

C++ program: Calculate the number of operations required to reach n using coin payments

Suppose we have five numbers, N, A, B, C, D. We start with the number 0 and end with N. We can change a number by using a certain number of coins. The specific operation is as follows:

  • Multiply the number by 2 and pay A coins
  • Multiply the number by 3 and pay B coins Coins
  • Multiply the number by 5, pay C coins
  • Increase or decrease the number by 1, pay D coins

We can do this any number of times and in any order these operations. We need to find the minimum number of coins required to reach N

So if the input is N = 11; A = 1; B = 2; C = 2; D = 8, then the output will be 19 because initially x is 0.

Use 8 coins to increase x by 1 (x=1).

Use 1 coin to multiply x by 2 (x=2).

Use 2 coins to multiply x by 5 (x=10).

Use 8 coins to increase it by 1 (x=11).

Steps

To solve this problem, we will follow the following steps:

Define one map f for integer type key and value
Define one map vis for integer type key and Boolean type value
Define a function calc, this will take n
if n is zero, then:
   return 0
if n is in vis, then:
   return f[n]
vis[n] := 1
res := calc(n / 2) + n mod 2 * d + a
if n mod 2 is non-zero, then:
   res := minimum of res and calc((n / 2 + 1) + (2 - n mod 2)) * d + a)
res := minimum of res and calc(n / 3) + n mod 3 * d + b
if n mod 3 is non-zero, then:
   res := minimum of res and calc((n / 3 + 1) + (3 - n mod 3)) * d + b)
res := minimum of res and calc(n / 5) + n mod 5 * d + c
if n mod 5 is non-zero, then:
   res := minimum of res and calc((n / 5 + 1) + (5 - n mod 5))
if (res - 1) / n + 1 > d, then:
   res := n * d
return f[n] = res
From the main method, set a, b, c and d, and call calc(n)
Copy after login

Example

Let us see the following implementation for better understanding Understand −

#include <bits/stdc++.h>
using namespace std;

int a, b, c, d;
map<long, long> f;
map<long, bool> vis;

long calc(long n){
   if (!n)
      return 0;
   if (vis.find(n) != vis.end())
      return f[n];
   vis[n] = 1;
   long res = calc(n / 2) + n % 2 * d + a;
   if (n % 2)
      res = min(res, calc(n / 2 + 1) + (2 - n % 2) * d + a);
   res = min(res, calc(n / 3) + n % 3 * d + b);
   if (n % 3)
      res = min(res, calc(n / 3 + 1) + (3 - n % 3) * d + b);
   res = min(res, calc(n / 5) + n % 5 * d + c);
   if (n % 5)
      res = min(res, calc(n / 5 + 1) + (5 - n % 5) * d + c);
   if ((res - 1) / n + 1 > d)
      res = n * d;
   return f[n] = res;
}
int solve(int N, int A, int B, int C, int D){
   a = A;
   b = B;
   c = C;
   d = D;
   return calc(N);
}
int main(){
   int N = 11;
   int A = 1;
   int B = 2;
   int C = 2;
   int D = 8;
   cout << solve(N, A, B, C, D) << endl;
}
Copy after login

Input

11, 1, 2, 2, 8
Copy after login

Output

19
Copy after login

The above is the detailed content of C++ program: Calculate the number of operations required to reach n using coin payments. For more information, please follow other related articles on the PHP Chinese website!

source:tutorialspoint.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template