题目描述:给你数字 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;
}
};
一上面思路写出的代码也确实没问题,通过了所有测试用例,但我们刚刚的思路也只是猜测,对于证明,在看了那么多题解后任不能让我自圆其说,所以仅仅说出案例证明:
- 如果给定的数就是斐波那契数,难道我们不直接取最大数吗?如果这个数不是斐波那契数,那如果按照其他方法将其减为斐波那契数,难道还不取最大数吗?
- 贪心算法的每一步都是为了以最小代价获取最大效益,为什么我不直接取一个数,而是要取多个数?况且多个数的和还没有一个数的大(这在官方题解已证明)
如上只是博主的片面理解,如果有更加深入的理解不妨在评论区展示😀