Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

พจน์ฟีโบนัชชีขั้นต่ำที่ผลรวมเท่ากับ K ใน C++


ในปัญหานี้ เราได้รับตัวเลข K ภารกิจของเราคือ หาพจน์ฟีโบนัชชีขั้นต่ำที่ผลรวมเท่ากับ K

ชุดฟีโบนัชชีสร้างตัวเลขถัดไปโดยการบวกสองตัวเลขก่อนหน้า ชุดฟีโบนัชชีเริ่มจากสองตัวเลข - F0 และ F1 ค่าเริ่มต้นของ F0 และ F1 สามารถ取เป็น 0, 1 หรือ 1, 1 ตามลำดับ

ชุดฟีโบนัชชีคือ 0 1 1 2 3 5 8 13

มาดูตัวอย่างเพื่อเข้าใจปัญหา

อินพุต

K = 5

เอาต์พุต

2

คำอธิบาย

ผลรวม 5 สามารถทำได้โดยใช้ 3 และ 2

วิธีการแก้ปัญหา

ด้วยการใช้ตัวเลขฟีโบนัชชี เราสามารถได้ผลรวมเป็นตัวเลขใดก็ได้เพราะ 1 เป็นตัวเลขฟีโบนัชชี การบวก 1 n ครั้งสามารถให้ผลรวมเป็น n ภารกิจของเราคือลดจำนวนตัวเลขฟีโบนัชชีที่ให้ผลรวม เราสามารถบรรลุคำตอบโดยใช้ฐานจากปัญหาเหรียญกึ่งหนึ่งที่เหรียญมีค่าเป็นตัวเลขฟีโบนัชชี ในภาษาโปรแกรม เทคนิคการแก้ปัญหานี้เรียกว่า greedy approach

ในตอนแรก เราบวกตัวเลขฟีโบนัชชีจนกว่าจะน้อยกว่าหรือเท่ากับผลรวม n จากนั้นเริ่มจากพจน์สุดท้าย เราลบพจน์นั้นออกจาก n จนกว่า n > พจน์ที่ k และนับจำนวนพจน์ไปด้วย เมื่อ n < พจน์ที่ k ให้ไปยังพจน์ฟีโบนัชชีที่อยู่ติดกันซึ่งน้อยกว่าหรือเท่ากับ n และพิมพ์ค่าของจำนวนนั้น

อัลกอริทึม

  • สร้างฟังก์ชันคำนวณพจน์ฟีโบนัชชี

  • คำนวณพจน์ฟีโบนัชชีทั้งหมดที่น้อยกว่าหรือเท่ากับ n

  • ถ้าพจน์ถัดไปมากกว่า n อย่าใส่ในเวกเตอร์และคืนค่า

  • สร้างฟังก์ชันหาจำนวนพจน์ฟีโบนัชชีขั้นต่ำที่ผลรวมเท่ากับ n

  • เริ่มต้นเวกเตอร์เก็บพจน์ฟีโบนัชชี

  • ลบพจน์ฟีโบนัชชีออกจากผลรวม n จนกว่าผลรวม > 0

  • หารผลรวม n ด้วยพจน์ฟีโบนัชชีที่ j เพื่อหาจำนวนพจน์ที่มีส่วนร่วมในผลรวม

  • พิมพ์จำนวนที่ได้เป็นผลลัพธ์

ตัวอย่าง

โปรแกรมสาธิตการทำงานของวิธีแก้ปัญหาของเรา

#include <bits/stdc++.h> using namespace std; void findFiboTerms(vector<int>& fiboVals, int K){    int i = 3, nextTerm;    fiboVals.push_back(0);    fiboVals.push_back(1);    fiboVals.push_back(1);    while (1) {       nextTerm = fiboVals[i - 1] + fiboVals[i - 2];       if (nextTerm > K)          return;       fiboVals.push_back(nextTerm);       i++;    } } int findTermForSum(int K){    vector<int> fiboVals;    findFiboTerms(fiboVals, K);    int termCount = 0, j = fiboVals.size() - 1;    while (K > 0) {       termCount += (K / fiboVals[j]);       K %= (fiboVals[j]);       j--;    }    return termCount; } int main(){    int K = 11;    cout<<"Minimum Fibonacci terms with sum equal to K is "<<findTermForSum(K);    return 0; }

เอาต์พุต

Minimum Fibonacci terms with sum equal to K is 2