Maison > développement back-end > C++ > le corps du texte

Programme C++ : calculez le nombre d'opérations nécessaires pour atteindre n à l'aide de paiements par pièces

WBOY
Libérer: 2023-09-14 20:53:04
avant
1176 Les gens l'ont consulté

Programme C++ : calculez le nombre dopérations nécessaires pour atteindre n à laide de paiements par pièces

Supposons que nous ayons cinq nombres, N, A, B, C, D. On commence par le chiffre 0 et on termine par N. On peut changer un nombre par un certain nombre de pièces, comme suit :

  • Multipliez le nombre par 2, payez les pièces A
  • Multipliez le nombre par 3, payez les pièces B
  • Multipliez le nombre par 5, payez les pièces C
  • augmentez ou diminuez le chiffre 1, payez les pièces D

Nous pouvons effectuer ces opérations un nombre illimité de fois et dans n'importe quel ordre. Nous devons trouver le nombre minimum de pièces requis pour atteindre N

Donc si l'entrée est N = 1 ; B = 2 ; alors la sortie sera 19 car initialement x est ; 0.

Utilisez 8 pièces pour augmenter x de 1 (x=1).

Utilisez 1 pièce pour multiplier x par 2 (x=2).

Utilisez 2 pièces pour multiplier x par 5 (x=10).

Utilisez 8 pièces pour l'augmenter de 1 (x=11).

Étapes

Pour résoudre ce problème, nous suivrons les étapes suivantes :

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)
Copier après la connexion

Exemple

Voyons l'implémentation ci-dessous pour une meilleure compréhension −

#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;
}
Copier après la connexion

Input

11, 1, 2, 2, 8
Copier après la connexion

Output

19
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!