Bài toán chia kẹo

Thứ sáu - 27/02/2026 21:03

Bài toán chia kẹo là một dạng toán điển hình, bài toán này có phương pháp giải đặc biệt, tư tưởng của nó có thể được áp dụng để giải cho rất nhiều bài toán khác trong Tin học . Nó còn có tên gọi là Number Partitioning, không có thuật toán tối ưu để giải. Sau đây là những thuật toán từ đơn giản đến khó để giải quyết bài tập này .

Nhắc lại bài toán chia kẹo

Có N gói kẹo, gói thứ i có Aicái kẹo. Không được bóc bất kỳ một gói kẹo nào, cần chia N gói kẹo thành hai phần sao cho độ chênh lệch số kẹo giữa hai gói là ít nhất.

Dữ liệu vào trong file “chiakeo.inp” có dạng :

- Dòng đầu tiên là số N(N<=100);

- Dòng thứ hai là N số Ai(i=1, 2,.., N; Ai <=100).

Kết quả ra file “chiakeo.out” có dạng:

- Dòng đầu là độ chênh lệch nhỏ nhất giữa hai phần có thể được.

- 2 dòng tiếp theo là 2 đoạn đã được chia ra sao cho chênh lệch là ít nhất

Thuật toán

1./ Vét cạn

Thuật toán vét cạn dễ hiểu nhất là xét tất cả các tập con có thể và tính tổng tập con sao cho chênh lệch nhỏ nhất với sum/2 ( sum là tổng giá trị của các phần từ a[i] ).Ưu điểm : Dễ hiểu, tính chính xác cao Nhược điểm : Độ phức tạp lớn O(2^n). Sẽ không khả thi nếu n là một số lớn.

2./ Tham lam

Thuật toán này cũng rất dễ hiểu, đó là sắp xếp lại mảng giảm dần , đưa 2 số lớn nhất vào 2 mảng, tiếp tục thêm số tiếp theo vào mảng có tổng bé hơn cho đến khi không còn số để đưa

Ví dụINPUT 56 3 4 8 1Đầu tiên sắp xếp lại mảng A ta được A(8,6,4,3,1)Đưa 2 số lớn nhất vào 2 mảng B và C , cụ thể B(8) và C(6)Xét tiếp A[3]=4 và ta nhận thấy mảng C có tổng bé hơn mảng A, ta đưa 4 vào mảng C, mảng C sẽ cập nhật lại là C(6,4)Tiếp tục xét đến A[4]=3, ta nhận thấy mảng B hiện tại có giá trị là 8 và thấp hơn mảng C=10, ta đưa A[4]=3 vào mảng BA[5]=1, ta nhận thấy mảng C thấp hơn mảng B, thêm A[5] vào mảng C Kết thúc chương trình ta có mảng B(8,3) và mảng C(6,4,1) và 2 mảng thỏa điều kiện chênh lệch ít nhất .Ưu điểm : Nhanh gọn, độ phức tạp nhỏ , dễ hiểu.Nhược điểm : Cho ra kết quả không được tốt lắm.

Phương pháp Karmarkar-Karp

Đây là một phương pháp cho kết quả khá tốt nhưng không khó cài đặt lắmĐầu tiên sắp xếp các số theo thứ tự giảm dần ,lấy 2 số lớn nhất và tìm hiệu của chúng , lấy hiệu của chúng và gán vào mảng A đang xét. Ví dụINPUT 67 1 2 5 9 6Sắp xếp mảng A theo thứ tự giảm dần ta có A(9,7,6,5,2,1)Xét 2 số đầu ta có hiệu là 2, đưa hiệu đó vào mảng ta được A(6,5,2,1,2)Tiếp tục lấy hiệu 2 số đầu và đưa vào cuối mảng ta được A(2,1,2,1)=>A(2,1,1)=>A(1,1)=>A(0), kết thúc chương trình khi mảng A còn 1 phần tử , và đó là độ chênh lệch nhỏ nhất giữa 2 đoạn.Ưu điểm : Cho ra kết quả tốt hơn phương pháp tham lam.Nhược điểm : Đây không phải là một thuật toán tối ưu, kết quả là độ chênh lệch , còn về việc in ra 2 đoạn con thì cần phải thiết lập thêm.

4./ Quy hoạch động

Gọi T là tổng các gói kẹo có được, chúng ta cần tìm dãy con có tổng bằng S sao cho T-2S là nhỏ nhất. Khi ta tìm được các phần tử của S sẽ là phần kẹo thứ nhất, phần kẹo thứ 2 sẽ là các phần tử còn lại Xét tất cả các gói kẹo để chọn ra gói kẹo j bé nhất thỏa mãn i ≥ A[j] và F[i-A[j]] ≤ j. Nếu F[i] = +∞ thì không chọn được. Nếu F[i] ≠ +∞ thì truy vết từ mảng F tìm ra chỉ số các gói kẹo cần chọn. Ưu điểm : Thuật toán này tối ưu nhất trong tất cả các cách trên.Nhược điểm : Khó hiểu cho các bạn mới tập làm quen với lập trình .

Code tham khảo áp dụng quy hoạch động tại đây


Mình là Khánh, người sáng lập nghengu.vn – nơi chia sẻ niềm yêu thích với tiếng Nghệ, tiếng Việt và những phương ngữ đa dạng. Mình mong muốn lan toả vẻ đẹp của tiếng mẹ đẻ đến nhiều người hơn. Nếu thấy nội dung hữu ích, bạn có thể ủng hộ bằng cách donate hoặc mua sản phẩm giáo dục qua các liên kết tiếp thị trong bài viết.

Cảm ơn bạn đã đồng hành!

Tổng số điểm của bài viết là: 0 trong 0 đánh giá

  Ý kiến bạn đọc

.
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây
https://thoitietviet.edu.vn đọc sách online https://xemthoitiet.com.vn https://thoitiet24.edu.vn RR88 fun88 เข้าระบบ TOPCLUB 88xx 79king ssc88 Cm88 CM88 https://open88s.com/ C168 ufabet https://webmarket.jpn.com/ Sv388 Xoilac Socolive TV Link nbet XX88 Socolive KJC https://okvip26.com/ Xoilac TV Live trực tiếp Cakhia TV Nohu90 Xoilac TV Socolive https://tt8811.net https://789pai.com https://mmoo.com.de https://go88.net/ c168 com five88 oxbet one88 xo88 https://playta88.com/ Bongdalu FUN88 ok9 kèo nhà cái 5 zowin.sh Cakhia TV Trực tiếp bóng đá Fun88 Bet KJC lu88 W 88 Alo789 99OK MB66 FLY88 FLY88 OK9 COM oxbet five88 net88 https://c168.tel/ https://c168b.com/ 789bet f8bet f8bet new88 new88 ta88 debet fabet cakhiatv Ok365 OPEN88.COM https://sunwin97.in.net https://383sports.baby 84win B52CLUB ZBET NET88 C168 xem bóng đá luongsontv http://cracks.ru.com/ ok9 c168 c168 c168 https://bongdalu.us.com/ https://socolive2.cv/ F8bet C168 Bet168 new88 Socolive TV https://oxbet.cheap/ https://tx88d.com/ https://nohu.photo/ ok8386 ok9 red88 new88 new88 new88 Yo88 88VV Vin777 ok8386 https://open88.mobi/ f8bet TT88 new88 f8bet https://rophim.ws I9BET tỷ lệ kèo 999bet Tài Xỉu Online da88 9bet https://f8bet.ae.org