假设我们有一个数字k,那么无论斐波那契数是否可以多次使用,我们都必须找到总和等于k的最小斐波那契数。
因此,如果输入像k = 7,则输出将为2,因为斐波那契数为:1、1、2、3、5、8、13 ...对于k = 7,我们可以使用2 + 5 = 7。
为了解决这个问题,我们将遵循以下步骤-
定义一个数组f
在f的末尾插入0
在f的末尾插入1
当f <= k的最后一个元素时-
将(f的最后一个元素+ f的倒数第二个元素)插入f
ret:= 0
j:= f的最后一个索引
而(j> = 0并且k> 0),做-
(将j减1)
k:= k-f [j]
(增加ret 1)
如果f [j] <= k,则-
除此以外
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMinFibonacciNumbers(int k) {
vector<int> f;
f.push_back(0);
f.push_back(1);
while (f.back() <= k) {
f.push_back(f[f.size() - 1] + f[f.size() - 2]);
}
int ret = 0;
int j = f.size() - 1;
while (j >= 0 && k > 0) {
if (f[j] <= k) {
k -= f[j];
ret++;
}
else
j--;
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.findMinFibonacciNumbers(7));
}7
输出结果
2