和为 K 的最少斐波那契数字数目(贪心)

Posted Aline2021-yxz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了和为 K 的最少斐波那契数字数目(贪心)相关的知识,希望对你有一定的参考价值。

题目描述:给你数字 k ,请你返回和为 k 的斐波那契数字的最少数目,其中,每个斐波那契数字都可以被使用多次。

斐波那契数字定义为:

  • F1 = 1
  • F2 = 1
  • Fn = Fn-1 + Fn-2 , 其中 n > 2

数据保证对于给定的 k ,一定能找到可行解。

示例 :

输入:k = 7

输出:2

解释:斐波那契数字为:1,1,2,3,5,8,13,……

对于 k = 7 ,我们可以得到 2 + 5 = 7 。

原题链接:1414. 和为 K 的最少斐波那契数字数——leetcode

题目分析:给我们斐波那契数列以及一个数,要求我们能使用最少的斐波那契数将给定的数归零,我们很难不想到贪心,只要每次选取的斐波那契数能够最大程度的让给定数归零,那选取的数字应该就是最少的。

class Solution 
public:
    int Big_FibNum(int x)
    
        int x1=1;
        int x2=1;
        while(x1+x2<=x)
        
            int tmp=x1;
            x1+=x2;
            x2=tmp;
        
        return x1;
    

    int findMinFibonacciNumbers(int k) 
        int count=0;
        while(k)
        
            k-=Big_FibNum(k);
            count++;
        
        
        return count;

    
;

一上面思路写出的代码也确实没问题,通过了所有测试用例,但我们刚刚的思路也只是猜测,对于证明,在看了那么多题解后任不能让我自圆其说,所以仅仅说出案例证明:

  1. 如果给定的数就是斐波那契数,难道我们不直接取最大数吗?如果这个数不是斐波那契数,那如果按照其他方法将其减为斐波那契数,难道还不取最大数吗?
  2. 贪心算法的每一步都是为了以最小代价获取最大效益,为什么我不直接取一个数,而是要取多个数?况且多个数的和还没有一个数的大(这在官方题解已证明)

如上只是博主的片面理解,如果有更加深入的理解不妨在评论区展示😀

以上是关于和为 K 的最少斐波那契数字数目(贪心)的主要内容,如果未能解决你的问题,请参考以下文章

和为 K 的最少斐波那契数字数目(贪心)

leetcode-5373-和为K的最少斐波那契数字数目

LeetCode 2000. 反转单词前缀 / 1414. 和为 K 的最少斐波那契数字数目(贪心证明) / 1725. 可以形成最大正方形的矩形数目

LeetCode 1414 和为K的最小斐波那契数字数目[贪心] HERODING的LeetCode之路

[POI2012]ROZ-Fibonacci Representation (贪心)

什么是k阶斐波那契序列?用汉语解释