COCI 2016/2017 - Contest 4 - Kas

View as PDF

Submit solution

Points: 1.00 (partial)
Time limit: 2.0s
Memory limit: 512M
Input: stdin
Output: stdout

Suggester:
Problem source:
COCI 2016/2017 - Contest 4
Problem type
Allowed languages
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Kile và Pogi nhặt được ~N~ tờ tiền trên đường. Sau khi chắc chắn không thể tìm thấy chủ nhân của số tiền trên, họ quyết định chia những tờ tiền với nhau sao cho tổng số tiền mà mỗi người nhận được là như nhau. Tất nhiên, tổng giá trị của những tờ tiền bị dư ra phải là nhỏ nhất có thể.

Bởi vì họ không thể đặt lại những tờ tiền bị dư ra về chỗ cũ, họ quyết định ghé vào một sòng bạc gần đó và đặt cược toàn bộ số tiền bị dư ra với hi vọng nhận được gấp đôi số tiền đã đặt cược. Vận may mỉm cười khi máy đánh bạc (slot machine) ra số 777 và họ quyết định chia đôi số tiền thắng cuộc. Sòng bạc sẽ luôn thanh toán sao cho Kile và Pogi có thể chia số tiền họ vừa thắng thành hai phần bằng nhau.

Với sự phấn khích tột độ, hai chàng trai đã đánh mất khả năng toán học của mình. Hãy giúp họ tính số tiền mỗi người sẽ nhận được nhé!

Input

Dòng đầu tiên chứa số nguyên dương ~N~ ~(1 \leq N \leq 500)~, số lượng tờ tiền trên đường.

Mỗi dòng trong số ~N~ dòng tiếp theo chứa một số nguyên dường ~c_i~ là giá trị của tờ tiền thứ ~i~. Tổng giá trị của những tờ tiền không quá ~100\:000~.

Output

Một giá trị duy nhất là số tiền mỗi người sẽ nhận được.

Subtask

  • ~10~ test có ~N \leq 13~.
  • ~4~ test có ~N \leq 50~ và tổng giá trị của những tờ tiền không quá ~1000~.
  • ~6~ test còn lại không có ràng buộc gì thêm.

Sample 1

Input
4
2
3
1
6
Output
6
Giải thích

Kile sẽ lấy tờ tiền với giá trị ~2~, ~3~, và ~1~. Pogi sẽ lấy tờ tiền với giá trị ~6~.

Sample 2

Input
5
2
3
5
8
13
Output
18
Giải thích

Kile sẽ lấy tờ tiền với giá trị ~5~ và ~8~. Pogi sẽ lấy tờ tiền với giá trị ~13~. Tờ tiền bị dư ra với giá trị ~2~ và ~3~ sẽ được "gấp đôi" trong sòng bạc. Do đó, số tiền mỗi người nhận được là ~13+5=18~


Comments

Please read the guidelines before commenting.



  • 4
    hieuhfgr  commented on Sept. 9, 2024, 12:38 p.m. edit 3

    Mô sai (my sol)

    Hints:

    ~a_i~ có 3 trạng thái là chọn cho Kile, chọn cho Pogi hoặc không chọn.

    gọi ~dp[i][remain]~ là số tiền lớn nhất của thằng có số tiền nhỏ hơn khi xét đến tờ tiền thứ ~i~ và thằng còn lại có số tiền lớn hơn ~remain~ đồng.

    Solution:

    Gọi mảng ~dp~ như ở trên khởi tạo ban đầu giá trị ~-1~. Nếu ~dp[i][remain]~ hiện tại đang xét đã được tính (khác ~-1~) thì ta chuyển trạng thái sang ~i+1~ như sau:

    • Không chọn ~i+1~: ~dp[i+1][rem] = max(dp[i+1][rem], dp[i][rem])~
    • Cho tờ tiền ~i+1~ cho thằng nhiều tiền hơn: ~dp[i+1][rem + a[i+1]] = max(dp[i+1][rem + a[i+1]], dp[i][rem])~
    • cho tờ tiền ~i+1~ cho thằng ít tiền hơn:
      • Nếu ~a_{i+1} <= rem~: ~dp[i+1][rem - a[i+1]] = max(dp[i+1][rem - a[i+1]], dp[i][rem] + a[i+1])~
      • Ngược lại: ~dp[i+1][a[i+1] - rem] = max(dp[i+1][a[i+1]-rem], dp[i][rem] + rem)~

    Gọi ~sum~ là tổng số tiền, kết quả của ta là: ~dp[n][0] + (Sum - dp[n][0] * 2)~

    lần 4 viết sol mong mọi ng đừng downvote T_T


    • -2
      xingyi  commented on Sept. 10, 2024, 1:51 a.m.

      Cam on vi da den !!!


    • -2
      hieudeptrai  commented on Sept. 10, 2024, 12:07 a.m.

      Cam on vi da den !!!


      • 0
        bread  commented on Sept. 10, 2024, 12:09 a.m.

        Cam on vi da den !!!