#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <climits>
using namespace std;
const int MAX = 5;
const int COMBINATION_SIZE = 5;
struct Supply {
int value;
int row;
int col;
};
int resupply(int shortfall, int supply[MAX][MAX]) {
vector<Supply> supplies;
// Chuyển ma trận thành vector các ô tiếp tế
for (int i = 0; i < MAX; ++i) {
for (int j = 0; j < MAX; ++j) {
supplies.push_back({supply[i][j], i, j});
}
}
// Sắp xếp vector theo giá trị tiếp tế tăng dần
sort(supplies.begin(), supplies.end(), [](const Supply &a, const Supply &b) {
return a.value < b.value;
});
int min_total = INT_MAX;
vector<int> result_indices;
// Sử dụng hồi quy để tìm tất cả các tổ hợp hợp lệ và chọn tổ hợp có tổng giá trị nhỏ nhất
function<void(int, int, int, vector<int>&)> find_combinations = [&](int start, int k, int sum, vector<int>& indices) {
if (k == 0) {
if (sum >= shortfall && sum < min_total) {
min_total = sum;
result_indices = indices;
}
return;
}
for (int i = start; i <= supplies.size() - k; ++i) {
indices.push_back(i);
find_combinations(i + 1, k - 1, sum + supplies[i].value, indices);
indices.pop_back();
}
};
vector<int> indices;
find_combinations(0, COMBINATION_SIZE, 0, indices);
// Trả về tổng giá trị của 5 ô được chọn
return min_total;
}
int main() {
int shortfall = 1050;
int supply[MAX][MAX] = {
{150, 200, 180, 90, 110},
{70, 80, 120, 140, 160},
{220, 240, 200, 190, 130},
{100, 110, 300, 280, 320},
{170, 210, 260, 230, 290}
};
int result = resupply(shortfall, supply);
cout << "Tổng tiếp tế của 5 ô được chọn: " << result << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGNsaW1pdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYID0gNTsKY29uc3QgaW50IENPTUJJTkFUSU9OX1NJWkUgPSA1OwoKc3RydWN0IFN1cHBseSB7CiAgICBpbnQgdmFsdWU7CiAgICBpbnQgcm93OwogICAgaW50IGNvbDsKfTsKCmludCByZXN1cHBseShpbnQgc2hvcnRmYWxsLCBpbnQgc3VwcGx5W01BWF1bTUFYXSkgewogICAgdmVjdG9yPFN1cHBseT4gc3VwcGxpZXM7CiAgICAKICAgIC8vIENodXnhu4NuIG1hIHRy4bqtbiB0aMOgbmggdmVjdG9yIGPDoWMgw7QgdGnhur9wIHThur8KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE1BWDsgKytqKSB7CiAgICAgICAgICAgIHN1cHBsaWVzLnB1c2hfYmFjayh7c3VwcGx5W2ldW2pdLCBpLCBqfSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvLyBT4bqvcCB44bq/cCB2ZWN0b3IgdGhlbyBnacOhIHRy4buLIHRp4bq/cCB04bq/IHTEg25nIGThuqduCiAgICBzb3J0KHN1cHBsaWVzLmJlZ2luKCksIHN1cHBsaWVzLmVuZCgpLCBbXShjb25zdCBTdXBwbHkgJmEsIGNvbnN0IFN1cHBseSAmYikgewogICAgICAgIHJldHVybiBhLnZhbHVlIDwgYi52YWx1ZTsKICAgIH0pOwogICAgCiAgICBpbnQgbWluX3RvdGFsID0gSU5UX01BWDsKICAgIHZlY3RvcjxpbnQ+IHJlc3VsdF9pbmRpY2VzOwoKICAgIC8vIFPhu60gZOG7pW5nIGjhu5NpIHF1eSDEkeG7gyB0w6xtIHThuqV0IGPhuqMgY8OhYyB04buVIGjhu6NwIGjhu6NwIGzhu4cgdsOgIGNo4buNbiB04buVIGjhu6NwIGPDsyB04buVbmcgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQKICAgIGZ1bmN0aW9uPHZvaWQoaW50LCBpbnQsIGludCwgdmVjdG9yPGludD4mKT4gZmluZF9jb21iaW5hdGlvbnMgPSBbJl0oaW50IHN0YXJ0LCBpbnQgaywgaW50IHN1bSwgdmVjdG9yPGludD4mIGluZGljZXMpIHsKICAgICAgICBpZiAoayA9PSAwKSB7CiAgICAgICAgICAgIGlmIChzdW0gPj0gc2hvcnRmYWxsICYmIHN1bSA8IG1pbl90b3RhbCkgewogICAgICAgICAgICAgICAgbWluX3RvdGFsID0gc3VtOwogICAgICAgICAgICAgICAgcmVzdWx0X2luZGljZXMgPSBpbmRpY2VzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBzdXBwbGllcy5zaXplKCkgLSBrOyArK2kpIHsKICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2soaSk7CiAgICAgICAgICAgIGZpbmRfY29tYmluYXRpb25zKGkgKyAxLCBrIC0gMSwgc3VtICsgc3VwcGxpZXNbaV0udmFsdWUsIGluZGljZXMpOwogICAgICAgICAgICBpbmRpY2VzLnBvcF9iYWNrKCk7CiAgICAgICAgfQogICAgfTsKCiAgICB2ZWN0b3I8aW50PiBpbmRpY2VzOwogICAgZmluZF9jb21iaW5hdGlvbnMoMCwgQ09NQklOQVRJT05fU0laRSwgMCwgaW5kaWNlcyk7CgogICAgLy8gVHLhuqMgduG7gSB04buVbmcgZ2nDoSB0cuG7iyBj4bunYSA1IMO0IMSRxrDhu6NjIGNo4buNbgogICAgcmV0dXJuIG1pbl90b3RhbDsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgc2hvcnRmYWxsID0gMTA1MDsKICAgIGludCBzdXBwbHlbTUFYXVtNQVhdID0gewogICAgICAgIHsxNTAsIDIwMCwgMTgwLCA5MCwgMTEwfSwKICAgICAgICB7NzAsIDgwLCAxMjAsIDE0MCwgMTYwfSwKICAgICAgICB7MjIwLCAyNDAsIDIwMCwgMTkwLCAxMzB9LAogICAgICAgIHsxMDAsIDExMCwgMzAwLCAyODAsIDMyMH0sCiAgICAgICAgezE3MCwgMjEwLCAyNjAsIDIzMCwgMjkwfQogICAgfTsKCiAgICBpbnQgcmVzdWx0ID0gcmVzdXBwbHkoc2hvcnRmYWxsLCBzdXBwbHkpOwogICAgY291dCA8PCAiVOG7lW5nIHRp4bq/cCB04bq/IGPhu6dhIDUgw7QgxJHGsOG7o2MgY2jhu41uOiAiIDw8IHJlc3VsdCA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9Cg==