和为 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. 贪心算法的每一步都是为了以最小代价获取最大效益,为什么我不直接取一个数,而是要取多个数?况且多个数的和还没有一个数的大(这在官方题解已证明)

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值