📜  总和等于K的最小斐波那契项

📅  最后修改于: 2021-05-04 18:43:54             🧑  作者: Mango

给定数字k,求出所需总和等于k的斐波纳契项的最小数量。我们可以多次选择斐波那契数。

例子:

Input : k = 4
Output : 2
Fibonacci term added twice that is
2 + 2 = 4. 
Other combinations are 
1 + 1 + 2. 
1 + 1 + 1 + 1
Among all cases first case has the 
minimum number of terms = 2.

Input : k = 17
Output : 3

推荐:请首先在IDE上尝试您的方法,然后查看解决方案

我们可以使用斐波那契数来求和,因为1是斐波那契数。例如,要获得n,我们可以n次加1。在这里,我们需要最小化有助于求和的斐波纳契数的数量。因此,此问题基本上是具有斐波那契值的硬币的找零问题。通过举一些例子,我们可以注意到,使用斐波那契硬币价值,贪婪方法是可行的。

首先,我们计算斐波纳契项,直到小于或等于k。然后从最后一项开始,继续从k中减去该项,直到k>(nth term)。与此同时,请继续增加术语数的计数。
当k <(第n个斐波纳契项)移动到小于或等于k的下一个斐波纳契项时。最后,打印计数值。

逐步算法为:

1. Find all Fibonacci Terms less than or equal to K.
  2. Initialize count = 0.
  3. j = Index of last calculated Fibonacci Term.
  4. while K > 0 do:
    
      // Greedy step
      count += K / (fibo[j])     // Note that division 
                                 // is repeated subtraction.
      K = K % (fibo[j])
      j--;
  5. Print count.

下面是上述方法的实现。

C++
// C++ code to find minimum number of fibonacci
// terms that sum to K.
#include 
using namespace std;
  
// Function to calculate Fibonacci Terms
void calcFiboTerms(vector& fiboTerms, int K)
{
    int i = 3, nextTerm;
    fiboTerms.push_back(0);
    fiboTerms.push_back(1);
    fiboTerms.push_back(1);
      
    // Calculate all Fibonacci terms
    // which are less than or equal to K.
    while (1) {
        nextTerm = fiboTerms[i - 1] + fiboTerms[i - 2];
  
        // If next term is greater than K
        // do not push it in vector and return.
        if (nextTerm > K)
            return;
  
        fiboTerms.push_back(nextTerm);
        i++;
    }
}
  
// Function to find the minimum number of
// Fibonacci terms having sum equal to K.
int findMinTerms(int K)
{
  
    // Vector to store Fibonacci terms.
    vector fiboTerms;
  
    calcFiboTerms(fiboTerms, K);
  
    int count = 0, j = fiboTerms.size() - 1;
  
    // Subtract Fibonacci terms from sum K 
    // until sum > 0.
    while (K > 0) {
          
        // Divide sum K by j-th Fibonacci term to find
        // how many terms it contribute in sum.
        count += (K / fiboTerms[j]);
        K %= (fiboTerms[j]);
  
        j--;
    }
  
    return count;
}
  
// driver code
int main()
{
    int K = 17;
  
    cout << findMinTerms(K);
  
    return 0;
}


Java
// Java code to find the minimum number of Fibonacci terms
// that sum to k.
import java.util.*;
  
class GFG
{
    // Function to calaculate Fibonacci Terms
    public static void calcFiboTerms(ArrayList fiboterms,
                                                            int k)
    {
        int i = 3, nextTerm = 0;
              
        fiboterms.add(0);
        fiboterms.add(1);
        fiboterms.add(1);
              
        // Calculate all Fibonacci terms
        // which are less than or equal to k.
        while(true)
        {
            nextTerm = fiboterms.get(i - 1) + fiboterms.get(i - 2);
                  
            // If next term is greater than k
            // do not add in arraylist and return.
            if(nextTerm>k)
            return;
                  
            fiboterms.add(nextTerm);
            i++;
        }
    }
      
    // Function to find the minimum number of
    // Fibonacci terms having sum equal to k.
    public static int fibMinTerms(int k)
    {
        // ArrayList to store Fibonacci terms.
        ArrayList fiboterms = new ArrayList();
        calcFiboTerms(fiboterms,k);
          
        int count = 0, j = fiboterms.size() - 1;
          
        // Subtract Fibonacci terms from sum k 
        // until sum > 0.
        while(k > 0)
        {
            // Divide sum k by j-th Fibonacci term to find
            // how many terms it contribute in sum.
            count += (k / fiboterms.get(j));
            k %= (fiboterms.get(j));
              
            j--;
        }
        return count;
    }
      
    // driver code
    public static void main (String[] args) {
      
        int k = 17;
      
        System.out.println(fibMinTerms(k));
    }
}
  
/* This code is contributed by Akash Singh*/


Python3
# Python3 code to find minimum number 
# of Fibonacci terms that sum to K. 
  
# Function to calculate Fibonacci Terms 
def calcFiboTerms(fiboTerms, K): 
  
    i = 3
    fiboTerms.append(0) 
    fiboTerms.append(1) 
    fiboTerms.append(1) 
      
    # Calculate all Fibonacci terms 
    # which are less than or equal to K. 
    while True: 
        nextTerm = (fiboTerms[i - 1] +
                    fiboTerms[i - 2])
  
        # If next term is greater than K 
        # do not push it in vector and return. 
        if nextTerm > K:
            return
  
        fiboTerms.append(nextTerm) 
        i += 1
      
# Function to find the minimum number of 
# Fibonacci terms having sum equal to K. 
def findMinTerms(K): 
  
    # Vector to store Fibonacci terms. 
    fiboTerms = [] 
    calcFiboTerms(fiboTerms, K) 
  
    count, j = 0, len(fiboTerms) - 1
  
    # Subtract Fibonacci terms from 
    # sum K until sum > 0. 
    while K > 0:
          
        # Divide sum K by j-th Fibonacci 
        # term to find how many terms it 
        # contribute in sum. 
        count += K // fiboTerms[j] 
        K %= fiboTerms[j] 
  
        j -= 1
      
    return count 
  
# Driver code 
if __name__ == "__main__": 
  
    K = 17
    print(findMinTerms(K)) 
  
# This code is contributed
# by Rituraj Jain


C#
// C# code to find the minimum number 
// of Fibonacci terms that sum to k.
using System;
using System.Collections.Generic; 
      
class GFG
{
// Function to calaculate Fibonacci Terms
public static void calcFiboTerms(List fiboterms,
                                      int k)
{
    int i = 3, nextTerm = 0;
          
    fiboterms.Add(0);
    fiboterms.Add(1);
    fiboterms.Add(1);
          
    // Calculate all Fibonacci terms
    // which are less than or equal to k.
    while(true)
    {
        nextTerm = fiboterms[i - 1] + 
                   fiboterms[i - 2];
              
        // If next term is greater than k
        // do not add in arraylist and return.
        if(nextTerm > k)
            return;
              
        fiboterms.Add(nextTerm);
        i++;
    }
}
  
// Function to find the minimum number of
// Fibonacci terms having sum equal to k.
public static int fibMinTerms(int k)
{
    // List to store Fibonacci terms.
    List fiboterms = new List();
    calcFiboTerms(fiboterms, k);
      
    int count = 0, j = fiboterms.Count - 1;
      
    // Subtract Fibonacci terms from sum k 
    // until sum > 0.
    while(k > 0)
    {
        // Divide sum k by j-th Fibonacci term to find
        // how many terms it contribute in sum.
        count += (k / fiboterms[j]);
        k %= (fiboterms[j]);
          
        j--;
    }
    return count;
}
  
// Driver Code
public static void Main (String[] args)
{
    int k = 17;
  
    Console.WriteLine(fibMinTerms(k));
}
}
  
// This code is contributed by PrinciRaj1992


输出:
3