เราได้รับตู้เก็บของสองตู้ สมมติว่า L1 และ L2 มีเงินจำนวนหนึ่งในรูปของเหรียญ L1 มีเหรียญ A และ L2 มีเหรียญ B อยู่ในนั้น เราต้องถอนเงินหรือเหรียญออกจากล็อกเกอร์เพื่อให้เงินที่ถอนออกมาได้สูงสุด ทุกครั้งที่ดึงเหรียญออกจากตู้ล็อคเกอร์ จะถูกแทนที่ด้วยเหรียญที่น้อยกว่าจำนวนก่อนหน้า 1 เหรียญ หากเราจั่วเหรียญ A จาก L1 เหรียญจะถูกแทนที่ด้วยเหรียญ A-1 และหากเราดึงเหรียญ B จาก L2 เหรียญนั้นจะถูกแทนที่ด้วยเหรียญ B-1 ภารกิจคือการเพิ่มจำนวนเงินสูงสุดที่ถอนออกในสองขั้นตอน นั่นหมายความว่าสามารถถอนเหรียญได้สองครั้งเท่านั้น
ป้อนข้อมูล − L1 - 10, L2 - 11
ผลผลิต −จำนวนเงินสูงสุดที่สามารถถอนได้ในสองขั้นตอน − 21
คำอธิบาย − ในขั้นตอนที่ 1 เราถอน 11 เหรียญจาก L2 L2 จะถูกแทนที่ด้วย 11-1=10 เหรียญ
ในขั้นตอนที่ 2 ทั้ง L1 และ L2 มี 10 เหรียญ จึงสามารถถอนออกจากเหรียญใดก็ได้ และเรามี 11+10=21 เหรียญ ซึ่งเป็นจำนวนสูงสุด
ป้อนข้อมูล − L1-5, L2-5
ผลผลิต −จำนวนเงินสูงสุดที่สามารถถอนได้ในสองขั้นตอน − 10
คำอธิบาย − ในขั้นตอนที่ 1 เราถอน 5 เหรียญจาก L1 L1 จะถูกแทนที่ด้วย 5-1=4 เหรียญ
ในขั้นตอนที่ 2 ทั้ง L1 มี 4 เหรียญ และ L2 มี 5 เหรียญ เราจึงนำเหรียญ 5 เหรียญจาก L2 และเรามี 5+5=10 เหรียญ ซึ่งสูงสุด
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
เรามีล็อกเกอร์ L1 และ L2 สองตัวเป็นจำนวนเต็มพร้อมเหรียญ
-
ฟังก์ชัน maxMoney(int A, int B) ใช้สำหรับป้อนจำนวนเหรียญในล็อกเกอร์
-
ภายใน maxMoney() เราใช้ 'เงิน' แบบแปรผันเพื่อเก็บจำนวนเงินสูงสุด
-
ในขั้นต้น เงินจะใช้ค่าจาก A หรือ B แล้วแต่จำนวนใดจะมากกว่า (money=A>B?A:B)
-
เปรียบเทียบค่าเงินกับ A หรือ B เพื่อเช็คว่าเหรียญไหนถูกถอนออก
-
ตอนนี้แทนที่คอนเทนเนอร์นั้นด้วย 1 น้อยกว่าจำนวนก่อนหน้า (A-- หรือ B--)
-
อีกครั้งเงินจะเพิ่มมูลค่าจาก A หรือ B แล้วแต่จำนวนใดจะมากกว่า (เงิน+=A>B?A:B)
ถ้า k น้อยกว่า องค์ประกอบ k ที่เล็กที่สุดก็จะมีผลรวมน้อยที่สุด − -
ใน D1 เก็บ abs((ผลรวมของอาร์เรย์ทั้งหมด) - (2*ผลรวมขององค์ประกอบอย่างน้อย k)) สองครั้งเพราะผลรวมอาร์เรย์ก็มีองค์ประกอบเหล่านี้เช่นกัน
หาก k มากกว่าองค์ประกอบ k ที่ใหญ่ที่สุดก็จะมีผลรวมสูงสุด −
-
ใน D2 เก็บ abs((ผลรวมของอาร์เรย์ทั้งหมด) - (2*ผลรวมขององค์ประกอบ k สูงสุด)) สองครั้งเพราะผลรวมอาร์เรย์ก็มีองค์ประกอบเหล่านี้เช่นกัน
-
เปรียบเทียบ D1 กับ D2 และเก็บค่าสูงสุดเป็น maxD
-
คืนค่า maxD เป็นผลลัพธ์
ตัวอย่าง
Code: #include <stdio.h> #include <math.h> // Function to return the maximum coins we can get int maxMoney(int A, int B){ //take coins int money=A>B?A:B; //refill the lockers with 1 less no.of coins if(money==A) A--; else B--; //withdraw again money+=A>B?A:B; return money; } // Driver code int main(){ int L1 = 8, L2 = 9; printf("Maximum money that can be withdrawn in two steps: %d" , maxMoney(L1, L2)); return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Maximum money that can be withdrawn in two steps: 17