Dado un número entero N , la tarea es contar el número de formas de representar N como la suma de potencias de 2 .
Ejemplos:
Entrada: N = 4
Salida: 4
Explicación: Todas las formas posibles de obtener la suma N usando potencias de 2 son {4, 2+2, 1+1+1+1, 2+1+1}.Entrada: N= 5
Salida: 4
Explicación: Todas las formas posibles de obtener la suma N usando potencias de 2 son {4 + 1, 2+2 + 1, 1+1+1+1 + 1, 2+1+1 + 1 }
Enfoque ingenuo: el enfoque más simple para resolver el problema es grepresentar
Enfoque eficiente: para optimizar el enfoque anterior, la idea es utilizar la recursividad . Defina una función f(N, K) que represente el número de formas de expresar N como una suma de potencias de 2 con todos los números que tienen una potencia menor o igual que k donde K ( = log 2 (N) ) es el máximo potencia de 2 que satisface 2 K ≤N .
Si (potencia(2, K) ≤ N) :
f(N, K) = f(N – potencia(2, K), K) + f(N, K – 1) //para comprobar si potencia(2, k) puede ser uno de los números.
De lo contrario:
f(N, K)=f(N, K – 1)
Casos base:
- Si (N = 0) f(N, K)=1 (Solo existe 1 forma posible de representar N)
- Si (k==0) f(N, K)=1 (Solo existe 1 forma posible de representar N tomando 2 0 )
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for above implementation #include <bits/stdc++.h> using namespace std; int numberOfWays(int n, int k) { // Base Cases if (n == 0) return 1; if (k == 0) return 1; // Check if 2^k can be used as // one of the numbers or not if (n >= pow(2, k)) { int curr_val = pow(2, k); return numberOfWays(n - curr_val, k) + numberOfWays(n, k - 1); } // Otherwise else // Count number of ways to // N using 2 ^ k - 1 return numberOfWays(n, k - 1); } // Driver Code int main() { int n = 4; int k = log2(n); cout << numberOfWays(n, k) << endl; }
Java
// Java program to implement // the above approach import java.util.*; class GFG { static int numberOfWays(int n, int k) { // Base Cases if (n == 0) return 1; if (k == 0) return 1; // Check if 2^k can be used as // one of the numbers or not if (n >= (int)Math.pow(2, k)) { int curr_val = (int)Math.pow(2, k); return numberOfWays(n - curr_val, k) + numberOfWays(n, k - 1); } // Otherwise else // Count number of ways to // N using 2 ^ k - 1 return numberOfWays(n, k - 1); } // Driver code public static void main(String[] args) { int n = 4; int k = (int)(Math.log(n) / Math.log(2)); System.out.println(numberOfWays(n, k)); } } // This code is contributed by susmitakundugoaldanga.
Python3
# Python3 program for above implementation from math import log2 def numberOfWays(n, k): # Base Cases if (n == 0): return 1 if (k == 0): return 1 # Check if 2^k can be used as # one of the numbers or not if (n >= pow(2, k)): curr_val = pow(2, k) return numberOfWays(n - curr_val, k) + numberOfWays(n, k - 1) # Otherwise else: # Count number of ways to # N using 2 ^ k - 1 return numberOfWays(n, k - 1) # Driver Code if __name__ == '__main__': n = 4 k = log2(n) print(numberOfWays(n, k)) # This code is contributed by mohit kumar 29
C#
// C# program to implement // the above approach using System; class GFG { static int numberOfWays(int n, int k) { // Base Cases if (n == 0) return 1; if (k == 0) return 1; // Check if 2^k can be used as // one of the numbers or not if (n >= (int)Math.Pow(2, k)) { int curr_val = (int)Math.Pow(2, k); return numberOfWays(n - curr_val, k) + numberOfWays(n, k - 1); } // Otherwise else // Count number of ways to // N using 2 ^ k - 1 return numberOfWays(n, k - 1); } // Driver code public static void Main(String[] args) { int n = 4; int k = (int)(Math.Log(n) / Math.Log(2)); Console.WriteLine(numberOfWays(n, k)); } } // This code is contributed by 29AjayKumar
Javascript
<script> // JavaScript program for above implementation function numberOfWays(n, k) { // Base Cases if (n == 0) return 1; if (k == 0) return 1; // Check if 2^k can be used as // one of the numbers or not if (n >= Math.pow(2, k)) { let curr_val = Math.pow(2, k); return numberOfWays(n - curr_val, k) + numberOfWays(n, k - 1); } // Otherwise else // Count number of ways to // N using 2 ^ k - 1 return numberOfWays(n, k - 1); } // Driver Code let n = 4; let k = Math.log2(n); document.write(numberOfWays(n, k) + "<br>"); // This code is contributed by Mayank Tyagi </script>
4
Complejidad de tiempo: O((logN+K) K ), donde K es log 2 (N)
Espacio auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por shekabhi1208 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA