原题链接:https://leetcode-cn.com/problems/find-the-minimum-number-of-fibonacci-numbers-whose-sum-is-k/
有三个可证明结论:
- 比k小的那个数肯定被选中
- 两个相邻的数肯定不会被选中
- 存在一种最少的方案不会选择重复的数
class Solution {
public:
int findMinFibonacciNumbers(int k) {
// 获得数组
vector<int> vec;
vec.emplace_back(1);
int a = 1, b = 1;
while (a + b <= k) {
int c = a + b;
vec.emplace_back(c);
a = b;
b = c;
}
// 查出和
int res = 0;
for (int i = vec.size() - 1; i >= 0 && k > 0; --i) {
if (k >= vec[i]) {
k -= vec[i];
res++;
}
}
return res;
}
};