ในปัญหานี้ เราได้รับอาร์เรย์ขนาด n และจำนวนเต็มบวก r งานของเราคือการพิมพ์องค์ประกอบที่เป็นไปได้ทั้งหมดของอาร์เรย์ของ sizer
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน −
อินพุต:{5,6,7,8}; r =3เอาต์พุต :{5,6,7}, {5,6,8}, {5,7,8}, {6,7,8}
ในการแก้ปัญหานี้ แนวทางจะเป็นการแก้ไของค์ประกอบแล้วเรียกซ้ำหรือวนซ้ำเพื่อหาชุดค่าผสมทั้งหมด ในนี้ต้องแก้ไขก่อน n-r+1 องค์ประกอบเท่านั้นและวนซ้ำหรือเกิดขึ้นซ้ำในส่วนที่เหลือ
ตัวอย่าง
#includeusing namespace std;void printRElementCombination(int arr[], int combination[], int start, ตั้งใจ, ดัชนี int, int r){ if (index ==r){ cout<<"{ "; สำหรับ (int j =0; j =r - index; i++){ combination[index] =arr[i]; printRElementCombination(arr, การรวมกัน, i+1, end, index+1, r); }}int main(){ int arr[] ={1, 2, 3, 4, 5}; int r =3; int n =5; การรวม int[r]; cout<<"ผลรวมคือ :\n"; printRElementCombination(arr, data, 0, n-1, 0, r);}
ผลลัพธ์
การรวมกันคือ −
<ก่อนหน้า>{ 1 2 3 } { 1 2 4 } { 1 2 5 } { 1 3 4 } { 1 3 5 } { 1 4 5 }{ 2 3 4 } { 2 3 5 } { 2 4 5 } { 3 4 5 }วิธีอื่นในการแก้ปัญหาเดียวกันคือการตรวจสอบการรวมองค์ประกอบปัจจุบันในการรวมกันและพิมพ์ชุดค่าผสมของขนาดที่ต้องการทั้งหมด แนวคิดจะเหมือนกัน เราจะกู้คืนองค์ประกอบและจัดเก็บชุดค่าผสมในอาร์เรย์คำสั่งผสม แต่ยังแก้ไของค์ประกอบไม่เสร็จ
โปรแกรมด้านล่างจะทำให้คุณเข้าใจปัญหามากขึ้น -
ตัวอย่าง
#includeใช้เนมสเปซ std;void combinationUtil(int arr[], int n, int r, int index, int combo[], int i){ if (index ==r){ cout<<" {"; สำหรับ (int j =0; j =n) กลับ; คำสั่งผสม[ดัชนี] =arr[i]; รวมUtil(arr, n, r, ดัชนี + 1, คอมโบ, i + 1); combinationUtil(arr, n, r, ดัชนี, คอมโบ, i+1);}int main(){ int arr[] ={1, 2, 3, 4, 5}; int r =3; int n =5; int คำสั่งผสม[r]; cout<<"ผลรวมคือ :\n"; combinationUtil(arr, n, r, 0, คอมโบ, 0); คืนค่า 0;}
ผลลัพธ์
การรวมกันคือ −
<ก่อนหน้า>{1 2 3 } {1 2 4 } {1 2 5 } {1 3 4 } {1 3 5 } {1 4 5 } {2 3 4 } {2 3 5 } {2 4 5 } {3 4 5 }