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

เงื่อนไขฟีโบนักชีขั้นต่ำที่มีผลรวมเท่ากับ K ใน C++


ในปัญหานี้ เราได้รับตัวเลข K หน้าที่ของเราคือ ค้นหาเงื่อนไข Fibonacci ขั้นต่ำที่มีผลรวมเท่ากับ K .

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

Fibonacci Series คือ 0 1 1 2 3 5 8 13

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

ป้อนข้อมูล

K = 5

ผลผลิต

2

คำอธิบาย

The sum 5 can be made using 3 and 2.

แนวทางการแก้ปัญหา

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

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

อัลกอริทึม

  • สร้างฟังก์ชันเพื่อคำนวณเงื่อนไขฟีโบนักชี

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

  • หากเทอมถัดไปมากกว่า n อย่าผลักมันในเวกเตอร์แล้วย้อนกลับ

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

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

  • ลบเงื่อนไขฟีโบนักชีจากผลรวม n จนถึงผลรวม>0

  • หารผลรวม n ด้วยเทอม Fibonacci เพื่อหาจำนวนพจน์ที่ส่งผลต่อผลรวม

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

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#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