สมมติว่าเรามีตัวเลข k เราต้องหาจำนวนขั้นต่ำของตัวเลขฟีโบนักชีที่มีผลรวมเท่ากับ k ไม่ว่าตัวเลขฟีโบนักชีจะถูกนำมาใช้หลายครั้งหรือไม่
ดังนั้น หากอินพุตเป็น k =7 ผลลัพธ์จะเป็น 2 เนื่องจากตัวเลขฟีโบนักชีคือ 1, 1, 2, 3, 5, 8, 13, ... สำหรับ k =7 เราสามารถใช้ 2 + 5 =7.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์ f
-
ใส่ 0 ที่ท้าย f
-
แทรก 1 ที่ส่วนท้ายของ f
-
ในขณะที่องค์ประกอบสุดท้ายของ f <=k ทำ −
-
แทรก (องค์ประกอบสุดท้ายของ f + องค์ประกอบสุดท้ายที่สองของ f) ลงใน f
-
-
ยกเลิก :=0
-
j :=ดัชนีสุดท้ายของ f
-
ในขณะที่ (j>=0 และ k> 0) ทำ -
-
ถ้า f[j] <=k แล้ว −
-
k :=k - f[j]
-
(เพิ่มการถอยกลับโดย 1)
-
-
มิฉะนั้น
-
(ลด j โดย 1)
-
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#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