#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... |