เราได้รับช็อคโกแลตจำนวนหนึ่งในกล่องที่ต่อเนื่องกันในรูปแบบของอาร์เรย์และตัวเลข k ซึ่งแสดงถึงจำนวนนักเรียนที่จะแจกจ่ายช็อคโกแลตเหล่านี้ งานในที่นี้คือการเลือกกล่องที่ต่อเนื่องกันเพื่อให้ผลรวมของช็อกโกแลตที่อยู่ในกล่องนั้นสามารถแบ่งให้นักเรียน k ได้เท่าๆ กัน นอกจากนี้เรายังต้องตรวจสอบให้แน่ใจว่าจำนวนช็อกโกแลตมีมากที่สุด
สำหรับสิ่งนี้ เราจะสำรวจอาร์เรย์จากซ้ายไปขวา และเริ่มเพิ่มจำนวนช็อกโกแลตแล้วหารผลรวมด้วย k หากหารด้วยเศษเหลือเท่ากับ 0 แล้วให้เก็บผลรวมนี้ไว้ในตัวแปร เมื่อเราดำเนินการต่อไป เราจะทำซ้ำขั้นตอนนี้จนกว่าเราจะได้ผลรวมสูงสุดดังกล่าว ปัญหาคือการหาผลรวมย่อยสูงสุดหารด้วย k
ป้อนข้อมูล
Choco[]={ 1,2,4,5,2,8,3,5 } k=3
ผลผลิต −จำนวนช็อกโกแลตสูงสุดที่จะแจกจ่ายให้นักเรียน k คนเท่าๆ กัน − 5
คำอธิบาย − อาร์เรย์ย่อยผลรวมสูงสุดคือ { 5,2,8 } ผลรวมของช็อกโกแลตคือ 15 แบ่งเท่า ๆ กัน นักเรียนทั้ง 3 คนจะได้รับช็อกโกแลตสูงสุด 5.
หมายเหตุ − กล่องเรียงต่อกันและดัชนีคือ { 3,4,5 }
ป้อนข้อมูล
Choco[] = { 2,3,7,5,4,8,2,6 } k=5
ผลผลิต −จำนวนช็อกโกแลตสูงสุดที่จะแจกจ่ายให้นักเรียน k คนเท่าๆ กัน − 7
คำอธิบาย − อาร์เรย์ย่อยผลรวมสูงสุดคือ { 3,7,5,4,8,2,6 } รวมช็อกโกแลต 35.
เมื่อแบ่งเท่าๆ กัน ช็อกโกแลตสูงสุดที่นักเรียนทั้ง 5 คนจะได้รับคือ 7
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
เราใช้อาร์เรย์จำนวนเต็ม arr[] ซึ่งบรรจุช็อกโกแลตจำนวนหนึ่งไว้ในภาชนะที่ต่อเนื่องกัน
-
จำนวนองค์ประกอบ 'n' หมายถึงจำนวนกล่อง
-
เอาเลขที่ ของนักเรียน 'k' เป็นข้อมูลป้อนเข้า
-
ฟังก์ชัน maxChocolate( int arr[], int n, int k ) รับอาร์กิวเมนต์สามตัว – อาร์เรย์ ขนาด และหมายเลข ของนักเรียน ก.
-
เราจะเริ่มสำรวจ arr[] ตั้งแต่ต้นโดยใช้ for loop
-
ใช้ตัวแปร sum และ maxSum สองตัว Sum เก็บผลรวมขององค์ประกอบที่ต่อเนื่องกันของอาร์เรย์ย่อย
-
maxSum ใช้เพื่อเก็บผลรวมสูงสุดที่พบจนถึงตอนนี้
-
Inside nested for loop ให้เพิ่มองค์ประกอบและตรวจสอบว่า sum%k ให้เศษ 0 หรือไม่
นอกจากนี้ หากผลรวมนี้> maxSum ให้อัปเดต maxSum
-
สุดท้าย maxSum จะมีจำนวนสูงสุด ของชอคโกแลตที่สามารถแบ่งให้นักเรียน k ได้เท่าๆกัน
-
คืนค่าผลลัพธ์เป็น maxSum/k ซึ่งเป็นจำนวนช็อกโกแลตที่นักเรียนแต่ละคนได้รับ
ตัวอย่าง
#include <stdio.h> // to find the maximum number // of chocolates to be distributed equally among // k students int maxChocolates(int arr[], int n, int k){ int sum; int maxSum = 0; for(int i=0;i<n;i++){ sum=0; for(int j=i;j<n;j++){ sum+=arr[j]; if(sum%k==0 && sum>maxSum) maxSum=sum; } } // distributed equally among 'k' students return (maxSum / k); } int main(){ int arr[] = { 2, 7, 6, 1, 4, 5 ,5, 3 }; int n =8; int k =3; printf("Maximum number of chocolates to be distributed equally among k students: %d ",maxChocolates(arr, n, k)); return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Maximum number of chocolates to be distributed equally among k students − 11