#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N, K, A[105], minSum = INT_MAX;
vector<int> blocks; // Lưu max của từng block hiện tại
void backtrack(int idx, int curK) {
    if (curK > K) return; // Nếu đã chia nhiều hơn K block, bỏ nhánh này
    if (idx == N) {
        if (curK == K) { // Đúng K block mới cập nhật
            int curSum = accumulate(blocks.begin(), blocks.end(), 0);
            minSum = min(minSum, curSum);
        }
        return;
    }
    // Thử đưa A[idx] vào từng block đã có
    for (int i = 0; i < curK; i++) {
        int oldMax = blocks[i];
        blocks[i] = max(blocks[i], A[idx]);
        backtrack(idx + 1, curK);
        blocks[i] = oldMax; // Quay lui
    }
    // Hoặc tạo block mới nếu chưa đạt K block
    if (curK < K) {
        blocks.push_back(A[idx]);
        backtrack(idx + 1, curK + 1);
        blocks.pop_back(); // Quay lui
    }
}
int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> N >> K;
    for (int i = 0; i < N; i++) cin >> A[i];
    backtrack(0, 0);
    cout << minSum << endl;
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |