ที่นี่เราจะเห็นโปรแกรมที่สามารถตรวจสอบว่าตัวเลขสามารถแบ่งออกเป็นมากกว่าหนึ่งกลุ่มโดยมีผลรวมเท่ากันหรือไม่ สมมติว่าตัวเลขเช่น 74325 จากนั้นสามารถแบ่งออกเป็นสามส่วน (7), (4, 3), (2, 5) ทั้งหมดมีค่า um เท่ากัน
เราต้องทำตามขั้นตอนเหล่านี้เพื่อแก้ปัญหานี้
- ใช้ตัวเลขเป็นสตริง
- ใช้อาร์เรย์เพื่อเก็บผลรวมนำหน้าของอาร์เรย์
- ตอนนี้กำลังข้ามจากองค์ประกอบที่สองไปยังองค์ประกอบสุดท้าย และส่วนแรกจะเป็น 0 ถึง i-1 ซึ่งผลรวมจะถูกวางไว้ที่ prefix_sum[i - 1]
- ใช้ตัวแปรอื่นที่ข้ามจาก 1 ถึง n แล้วบวกผลรวมต่อไป
- หากค่าผลรวมเหมือนกับค่า prefix_sum[i – 1] ในขั้นตอนใดๆ เซ็กเมนต์จะมีผลรวมเท่ากับค่าแรก
- เริ่มต้นค่าผลรวมของเซ็กเมนต์ใหม่เป็น 0 จากนั้นเลื่อนตัวชี้ต่อไป
- หากผลรวมของเซ็กเมนต์มากกว่า prefix_sum[i – 1] ในขั้นใดๆ ให้ทำลายลูป
- หากเราไปถึงจุดหมายสุดท้าย และหากผลรวมของส่วนสุดท้ายเท่ากับผลรวมของส่วนแรก ก็สามารถแบ่งออกเป็นส่วนๆ ของผลรวมที่เท่ากันได้
ตัวอย่าง
#include <iostream> using namespace std; bool canBeSegmented(string str) { int n = str.length(); int prefix_sum[n]; prefix_sum[0] = str[0] - '0'; for (int i = 1; i < n; i++) { prefix_sum[i] = prefix_sum[i - 1] + (str[i] - '0'); } for (int i = 1; i <= n - 1; i++) { int sum = prefix_sum[i - 1]; int prev_sum = 0; int it = i; bool flag = false; while (it < n) { prev_sum += str[it] - '0'; if (prev_sum == sum) { prev_sum = 0; flag = true; } else if (prev_sum > sum) { break; } it++; } if (prev_sum == 0 && it == n && flag) { return true; } } return false; } int main() { string s = "74325"; if (canBeSegmented(s)) cout << "Yes, This can be segmented into more than two segments"; else cout << "No, This can not be segmented into more than two segments"; }
ผลลัพธ์
Yes, This can be segmented into more than two segments