ในปัญหานี้ เราได้รับอาร์เรย์และผลรวม งานของเราคือการสร้างโปรแกรมที่จะหาผลรวม subarray สูงสุดที่มีผลรวมน้อยกว่าหรือเท่ากับผลรวมที่กำหนดใน c ++
เราต้องหาอาร์เรย์ย่อยที่มีความยาวน้อยกว่าหรือเท่ากับ n ซึ่งมีผลรวมน้อยกว่าหรือเท่ากับผลรวมที่กำหนด
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล − array ={3, 5, 1, 8, 2, 9}, ผลรวม =25
ผลผลิต − 25
คำอธิบาย − อาร์เรย์ย่อยที่มีผลรวมน้อยกว่าหรือเท่ากับ 25 คือ {5, 1, 8, 2, 9}
วิธีง่ายๆ วิธีหนึ่งในการหาอาร์เรย์ย่อยผลรวมสูงสุดคือการวนซ้ำบนอาร์เรย์และค้นหาผลรวมของอาร์เรย์ย่อยทั้งหมด จากนั้นจึงหาผลรวมที่ใกล้ที่สุดหรือเท่ากับ แต่วิธีนี้จะมีความซับซ้อนของเวลาของ O(n*n) เนื่องจากต้องใช้สองลูป
วิธีที่มีประสิทธิภาพมากขึ้นในการแก้ปัญหานี้คือการใช้ หน้าต่างบานเลื่อน กระบวนการ. ซึ่งเราจะตรวจสอบผลรวมปัจจุบันด้วยผลรวมสูงสุด และเพิ่มหรือลบองค์ประกอบในหน้าต่างตามการเปรียบเทียบ
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <iostream>
using namespace std;
int findMax(int a, int b){
if(a>b)
return a;
return b;
}
int maxSumsubarray(int arr[], int n, int maxSum){
int sum = arr[0], overallMax = 0, start = 0;
for (int i = 1; i < n; i++) {
if (sum <= maxSum)
overallMax = findMax(overallMax, sum);
while (sum + arr[i] > maxSum && start < i) {
sum -= arr[start];
start++;
}
sum += arr[i];
}
if (sum <= maxSum)
overallMax = findMax(overallMax, sum);
return overallMax;
}
int main(){
int arr[] = {3, 1, 4, 7, 2, 9, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int sum = 20;
cout<<"The maximum sum of subarray with sum less than or equal to "<<sum<<" is "<<maxSumsubarray(arr, n, sum);
return 0;
} ผลลัพธ์
The maximum sum of subarray with sum less than or equal to 20 is 18