: ๋นํธ๋ง์คํน
: 220906 ํ
https://www.acmicpc.net/source/48808448
์๋ ๋นจ๊ฐ ์ค ๋ด์ฉ์ ๋ํด์ ์๊ฐํด๋ณด๋ฉด, cost ๋น์ฉ์ ์ธ๋ฑ์ค๋ก ํด์
second ๊ฐ์ vector๋ก ๋์ดํด์ผ ํ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์๊ฐํด์ผ ํจ.
: ์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด sort ์ด์ ๊ณผ ์ดํ์ first ๊ฐ ๋ฟ์๋๋ผ, second ๊ฐ๋
๋ค๋ฅด๊ฒ ์ถ๋ ฅ๋จ์ ๋ด์ผ ํจ.
https://velog.io/@kwt0124/map-vector-vectorvector-%EB%B3%80%ED%99%98
: mapping ์ค๋ณต ์ ์ฅ
https://www.acmicpc.net/submit/19942/47795525
3
0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
: ๋ฒกํฐ์๋ค๊ฐ ๋ค ์ง์ด๋๊ณ , ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์.
๋ฌธ์ ์ ์ด ์์...
compare์ ๊ฒฝ์ฐ, ๋น๊ต๋์์ด ๋์ผํ ๊ฒฝ์ฐ์ ,,,
๋ฐ๋์ false๋ฅผ ๋ฐํํ๊ฑฐ๋, ์๋๋ฉด, ๋น๊ต์์ ํตํด์ ๋ฐํ์ ํด์ผํจ!
#include <iostream>
using namespace std;
#include <vector>
#include <string>
#include <algorithm>
struct yori
{
int mp;
int mf;
int ms;
int mv;
int price;
};
bool compare(vector<int>&a, vector<int>&b)
{
//๋ง์ง๋ง ์์๊ฐ ์ดํฉ price์ ์ด๊ฑธ๋ก ๋น๊ตํด์ผ ํจ.
if (a[a.size() - 1] < b[b.size() - 1])
return true;
else if (a[a.size() - 1] == b[b.size() - 1])
{
//๋์ผํ ๊ฒฝ์ฐ, ์ฒ๋ฆฌ๋ฅผ ํด์ผํจ.
//๋ง์ฝ์ a์ ์ฌ์ ์์ด ๋ ์์ ๋ค๋ฉด, true
// ์๋๋ฉด b๊ฐ ์์ ๋ค๋ฉด false;
int mmmin = min(a.size(), b.size());
bool cc = false;
for (int i = 0; i < mmmin; ++i)
{
if (a[i] < b[i])
{
cc = true;
}
}
// ๊ฐ์ ๊ฒฝ์ฐ์ false๋ก ๋ฐํํด์ผ ํจ...
return false;
//๋ชจ๋ ์ปจํ
์ด๋์
//if (a[0] < b[0])
// return true;
//else
// return false;
}
return false;
}
int main()
{
int n;
cin >> n;
yori mmin;
cin >> mmin.mp >> mmin.mf >> mmin.ms >> mmin.mv;
int mmax = 0;
vector<yori>v(n);
for (int i = 0; i < n; ++i)
{
cin >> v[i].mp >> v[i].mf >> v[i].ms
>> v[i].mv >> v[i].price;
mmax += v[i].price;
}
//cout << "output" << endl;
//for (int i = 0; i < n; ++i)
//{
// cout << v[i].mp << ","<< v[i].mf <<
// "," << v[i].ms << "," << v[i].mv
// << "," << v[i].price;
// cout << endl;
//}
// ์ด์ฐจ์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํจ.
vector<vector<int>>res;
//vector<int>res;
// price๋ฅผ ๋นผ๋ก 4๊ฐ๋ฅผ ํ์ธํด์ผ ํจ.
// ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก.
// ๋นํธ๋ง์คํน์ ํ์ฉํจ.
for (int i = 0; i < (1 << n); ++i)
{
yori test{0,0,0,0,0};
vector<bool>check(n, false);
//๊ฐ๊ฐ์ ์์๋ฅผ ํ์ธํด์ผ ํจ.
for (int j = 0; j < v.size(); ++j)
{
// 1 2 3 4 5 6
// 1๋ก ํ๋ฉด ์๋จ.
// ์ฐธ์ผ ๊ฒฝ์ฐ์๋ง , ํด๋น ์๋ฆฟ์๊ฐ 1์ผ ๊ฒฝ์ฐ๋ฅผ ๋ปํจ.
if (i & (1 << j))
{
test.mf += v[j].mf;
test.mp += v[j].mp;
test.mv += v[j].mv;
test.ms += v[j].ms;
test.price += v[j].price;
check[j] = true;
}
}
// ์ต์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ฉด ์ ์ฅ
// ์ฆ, mmin vs test๋ฅผ ๋น๊ตํด์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด.
// ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด ๋์.
if (test.mf >= mmin.mf && test.mp >= mmin.mp
&& test.mv >= mmin.mv && test.ms >= mmin.ms)
{
// ์ ๋ ฌํด์ ํ๊ธฐ์๋ ๋ณต์กํ๋๊น.
// price์ ์ดํฉ๊ณ๋ฅผ ๋น๊ตํ๋ฉด์ ์ปทํ
ํ๋ ๋ฐฉ๋ฒ์ผ๋ก
// ๋ณ๊ฒฝํ์.
//if (mmax > test.price)
//{
// // test.price๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ์ฌ์ ์์ผ๋ก ์ถ๋ ฅ์ด๋ฏ๋ก
// // ์กฐ๊ฑด์ ์ด๋ ๊ฒ๋ง ๋์.
// mmax = test.price;
// res.clear();
// for (int k = 0; k < v.size(); ++k)
// {
// if (check[k] == true)
// {
// res.push_back(k);
// }
// }
//}
//if (mmax > test.price)
//{
// mmax = test.price;
//}
vector<int>tt;
// ์ด๋ค ์์๊ฐ ์ ํ๋ฌ๋์ง๋ฅผ ์์์ผ ํจ.
// ์ฒดํฌ ๋ถ๋ณ์๋ฅผ ์ฌ์ฉํ์.
for (int k = 0; k < v.size(); ++k)
{
if (check[k] == true)
{
tt.push_back(k);
//cout << k << " "; ์ถ๋ ฅ์ฉ
}
}
tt.push_back(test.price);
res.push_back(tt);
//cout << test.price << endl; ์ถ๋ ฅ์ฉ
}
// ๋ง์ง๋ง์ sort๋ฅผ ํด์ผ ํ ๋ฏํจ.
//๊ทธ๋ฆฌ๊ณ 2์ค ํฌ๋ฌธ ์์์ ์งํ๋๋ฏ๋ก,
// ์ปจํ
์ด๋๋ ์ธ๋ถ์์ ์ ์ธํ๋๋ก ํ์.
}
// 2์ค ํฌ๋ฌธ ์ถ๋ ฅํด๋ณด์.
//for (int a = 0; a < res.size(); ++a)
//{
// for (int b = 0; b < res[a].size(); ++b)
// {
// cout << res[a][b] << " ";
// }
// cout << endl;
//}
//cout << "sorting" << endl;
sort(res.begin(), res.end() , compare);
for (int a = 0; a < res.size(); ++a)
{
for (int b = 0; b < res[a].size(); ++b)
{
cout << res[a][b] << " ";
}
cout << endl;
}
if (res.size() == 0)
{
cout << -1;
}
else
{
cout << res[0][res[0].size() - 1] << endl;
for (int i = 0; i < res[0].size() - 1; ++i)
cout << res[0][i] + 1 << " ";
// ์ด์ฐจ์ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ 0์ด๊ณ ,
// ๊ทธ ์์ ๋ฒกํฐ๋ฅผ ์ถ๋ ฅํด์ผ ํจ.
}
}
#include <iostream>
using namespace std;
#include <vector>
#include <string>
#include <algorithm>
struct yori
{
int mp;
int mf;
int ms;
int mv;
int price;
};
bool compare(vector<int>&a, vector<int>&b)
{
//๋ง์ง๋ง ์์๊ฐ ์ดํฉ price์ ์ด๊ฑธ๋ก ๋น๊ตํด์ผ ํจ.
if (a[a.size() - 1] < b[b.size() - 1])
return true;
else if (a[a.size() - 1] == b[b.size() - 1])
{
//๋์ผํ ๊ฒฝ์ฐ, ์ฒ๋ฆฌ๋ฅผ ํด์ผํจ.
//๋ง์ฝ์ a์ ์ฌ์ ์์ด ๋ ์์ ๋ค๋ฉด, true
// ์๋๋ฉด b๊ฐ ์์ ๋ค๋ฉด false;
int mmmin = min(a.size(), b.size()) - 1;
bool cc = false;
for (int i = 0; i < mmmin; ++i)
{
if (a[i] == b[i])
continue;
return a[i] < b[i];
//if (a[i] < b[i])
//{
// cc = true;
//}
}
// ๊ฐ์ ๊ฒฝ์ฐ์ false๋ก ๋ฐํํด์ผ ํจ...
//return false;
//๋ชจ๋ ์ปจํ
์ด๋์
//if (a[0] < b[0])
// return true;
//else
// return false;
}
return false;
}
int main()
{
int n;
cin >> n;
yori mmin;
cin >> mmin.mp >> mmin.mf >> mmin.ms >> mmin.mv;
int mmax = 0;
vector<yori>v(n);
for (int i = 0; i < n; ++i)
{
cin >> v[i].mp >> v[i].mf >> v[i].ms
>> v[i].mv >> v[i].price;
mmax += v[i].price;
}
//cout << "output" << endl;
//for (int i = 0; i < n; ++i)
//{
// cout << v[i].mp << ","<< v[i].mf <<
// "," << v[i].ms << "," << v[i].mv
// << "," << v[i].price;
// cout << endl;
//}
// ์ด์ฐจ์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํจ.
vector<vector<int>>res;
//vector<int>res;
// price๋ฅผ ๋นผ๋ก 4๊ฐ๋ฅผ ํ์ธํด์ผ ํจ.
// ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก.
// ๋นํธ๋ง์คํน์ ํ์ฉํจ.
for (int i = 0; i < (1 << n); ++i)
{
yori test{0,0,0,0,0};
vector<bool>check(n, false);
//๊ฐ๊ฐ์ ์์๋ฅผ ํ์ธํด์ผ ํจ.
for (int j = 0; j < v.size(); ++j)
{
// 1 2 3 4 5 6
// 1๋ก ํ๋ฉด ์๋จ.
// ์ฐธ์ผ ๊ฒฝ์ฐ์๋ง , ํด๋น ์๋ฆฟ์๊ฐ 1์ผ ๊ฒฝ์ฐ๋ฅผ ๋ปํจ.
if (i & (1 << j))
{
test.mf += v[j].mf;
test.mp += v[j].mp;
test.mv += v[j].mv;
test.ms += v[j].ms;
test.price += v[j].price;
check[j] = true;
}
}
// ์ต์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ฉด ์ ์ฅ
// ์ฆ, mmin vs test๋ฅผ ๋น๊ตํด์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด.
// ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด ๋์.
if (test.mf >= mmin.mf && test.mp >= mmin.mp
&& test.mv >= mmin.mv && test.ms >= mmin.ms)
{
// ์ ๋ ฌํด์ ํ๊ธฐ์๋ ๋ณต์กํ๋๊น.
// price์ ์ดํฉ๊ณ๋ฅผ ๋น๊ตํ๋ฉด์ ์ปทํ
ํ๋ ๋ฐฉ๋ฒ์ผ๋ก
// ๋ณ๊ฒฝํ์.
//if (mmax > test.price)
//{
// // test.price๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ์ฌ์ ์์ผ๋ก ์ถ๋ ฅ์ด๋ฏ๋ก
// // ์กฐ๊ฑด์ ์ด๋ ๊ฒ๋ง ๋์.
// mmax = test.price;
// res.clear();
// for (int k = 0; k < v.size(); ++k)
// {
// if (check[k] == true)
// {
// res.push_back(k);
// }
// }
//}
//if (mmax > test.price)
//{
// mmax = test.price;
//}
vector<int>tt;
// ์ด๋ค ์์๊ฐ ์ ํ๋ฌ๋์ง๋ฅผ ์์์ผ ํจ.
// ์ฒดํฌ ๋ถ๋ณ์๋ฅผ ์ฌ์ฉํ์.
for (int k = 0; k < v.size(); ++k)
{
if (check[k] == true)
{
tt.push_back(k);
//cout << k << " "; ์ถ๋ ฅ์ฉ
}
}
tt.push_back(test.price);
res.push_back(tt);
//cout << test.price << endl; ์ถ๋ ฅ์ฉ
}
// ๋ง์ง๋ง์ sort๋ฅผ ํด์ผ ํ ๋ฏํจ.
//๊ทธ๋ฆฌ๊ณ 2์ค ํฌ๋ฌธ ์์์ ์งํ๋๋ฏ๋ก,
// ์ปจํ
์ด๋๋ ์ธ๋ถ์์ ์ ์ธํ๋๋ก ํ์.
}
// 2์ค ํฌ๋ฌธ ์ถ๋ ฅํด๋ณด์.
//for (int a = 0; a < res.size(); ++a)
//{
// for (int b = 0; b < res[a].size(); ++b)
// {
// cout << res[a][b] << " ";
// }
// cout << endl;
//}
//cout << "sorting" << endl;
sort(res.begin(), res.end() , compare);
//for (int a = 0; a < res.size(); ++a)
//{
// for (int b = 0; b < res[a].size(); ++b)
// {
// cout << res[a][b] << " ";
// }
// cout << endl;
//}
if (res.size() == 0)
{
cout << -1;
}
else
{
cout << res[0][res[0].size() - 1] << endl;
for (int i = 0; i < res[0].size() - 1; ++i)
cout << res[0][i] + 1 << " ";
// ์ด์ฐจ์ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ 0์ด๊ณ ,
// ๊ทธ ์์ ๋ฒกํฐ๋ฅผ ์ถ๋ ฅํด์ผ ํจ.
}
}
: map๊ณผ vector<vector>
๊ฐ ์ด์งธ์ ์ด์ฐจ์ ๋ฒกํฐ ํ์์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง ์์๋ณด์.
#include <string>
#include <vector>
#include <iostream>
#include <tuple>
#include <map>
using namespace std;
struct jaeryo
{
int m1;
int m2;
int m3;
int m4;
int cost;
};
int main()
{
int n;
cin >> n;
// ๊ฐ์ ๋น์ฉ์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ, ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒ์ด๋ฏ๋ก,
// ์ ๋ ฌ์ ํด์ผ ํจ.
jaeryo input;
cin >> input.m1 >> input.m2 >> input.m3 >> input.m4;
// tuple ๋ณด๋ค๋ struct๋ฅผ ์ฌ์ฉํ์.
map<int, jaeryo>m;
for (int i = 0; i < n; ++i)
{
jaeryo j;
cin >> j.m1;
cin >> j.m2;
cin >> j.m3;
cin >> j.m4;
cin >> j.cost;
m.insert(make_pair(i , j));
}
/*
for (auto iter : m)
{
cout << "์ฌ๋ฃ : " << iter.first << " ๋ฒ, ";
cout << "๋จ๋ฐฑ์ง : " << iter.second.m1;
cout << "์ง๋ฐฉ : " << iter.second.m2;
cout << "ํ์ํ๋ฌผ : " << iter.second.m3;
cout << "๋นํ๋ฏผ : " << iter.second.m4;
cout << "๊ฐ๊ฒฉ : " << iter.second.cost;
cout << endl;
}
*/
// ์ต์ข
์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ ๋ณ์๋
// cost์ ์ฌ๋ฃ์ ๋ฒํธ๋ค์ ์์ธ๋ฐ
// ์ฌ๋ฃ์ ๋ฒํธ๋ค์ด 2๊ฐ์ผ ์ ์๊ณ , 3๊ฐ ์ผ ์๋ ์๊ณ ,,
map<int,vector<int>>result;
// ๋นํธ๋ง์คํน์ผ๋ก ๊ฐ 6๊ฐ๋ฅผ ๋๋ฉด์
// ๋ง์ฝ์ ์กฐ๊ฑด์ ์ผ์นํ ๊ฒฝ์ฐ
// ๋ฒกํฐ์๋ค๊ฐ ์ผ๋จ ๋ฃ์.
for (int i = 0; i < (1 << n); ++i)
{
// i๋ฅผ ๊ฐ์ง๊ณ ๋ชจ๋ ์ฌ๋ฃ์ธ n๊ณผ
// ๊ฐ ์์๊ฐ 1์ผ ๊ฒฝ์ฐ, ์ฆ ํด๋น ์ฌ๋ฃ ์ฌ์ฉ ์ ๋ฌด๋ฅผ
// ์ฒดํฌํ๋ฉด์ sum์ ๊ณ์ฐ
jaeryo sum;
sum.m1 = 0;
sum.m2 = 0;
sum.m3 = 0;
sum.m4 = 0;
vector<bool>check(n, false);
int tempCost = 0;
for (int j = 0; j < n; ++j)
{
// ๊ฐ ์์์์ ์ฌ๋ฃ ์ ํ ํ ๊น? ๋ง๊น ์ฒดํฌ ํ๋ ๋ถ๋ถ
if (i & (1 << j))
{
//ํด๋น ์๋ฆฌ์ ์ฌ๋ฃ๋ฅผ ์ ํํ ๊ฒฝ์ฐ, ํฉ์ ๊ตฌํ๋ค.
sum.m1 += m[j].m1;
sum.m2 += m[j].m2;
sum.m3 += m[j].m3;
sum.m4 += m[j].m4;
check[j] = true;
tempCost += m[j].cost;
}
}
// ์กฐ๊ฑด๊ณผ ํ์ธํ์.
if (sum.m1 >= input.m1 && sum.m2 >= input.m2
&& sum.m3 >= input.m3 && sum.m4 >= input.m4)
{
vector<int>kk;
// cost ์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ํ๋์ ๋ฒกํฐ์๋ค๊ฐ ์ ์ฅ์
// ํด๋๊ณ ,,,, cost๊ฐ ๊ฐ์ฅ ๋ฎ์ ๊ฑฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์
// ์ ๋ ฌํ์.
for (int k = 0; k < check.size(); ++k)
{
if (check[k] == true)
{
kk.push_back(k);
}
}
result.insert(make_pair(tempCost, kk));
}
}
if (result.empty())
cout << "-1";
else
{
// ์ ์ฒด ํ์ธํ๊ธฐ
for (auto iter : result)
{
cout << "cost : ";
cout << iter.first << endl;
cout << " ";
cout << "์ฌ๋ฃ์ ๋ฒํธ๋ค ";
for (int i = 0; i < iter.second.size(); ++i)
{
cout << iter.second[i] + 1;
cout << " ";
//cout << ",";
}
cout << endl;
//break;
}
}
}
-> ์ฒซ๋ฒ์งธ๋ง ๋์ค๊ฒ ํ๋ค์์ ์ถ๋ ฅํจ.
๊ฒฐ๊ณผ๋ ํ๋ฆฌ๋ค๊ณ ํจ... ใ
กใ
ก
๋ฐ๋ก ๋๋ฆฝ๋๋ค. (๊ฒ์๊ธ์ ์ด๋ฏธ ์์ต๋๋ค.)
input :
3
0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
output :
0
3
answer :
0
1 2 3
์ฌ์ ์์ผ๋ก ์์๋ ๊ฒ์ ์ถ๋ ฅํด์ผํฉ๋๋ค.
: ๋ง์ฝ์ tempCost์ ๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ, ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒ์
์ถ๋ ฅํ๋ผ๋ ์กฐ๊ฑด์ด ์์.
์ด๋ฅผ ์ฝ๋์ ์ ์ฉํ์ง ๋ชปํด์ ํ๋ฆฐ ๊ฒ์.
๋ฉํฐ๋งต์ ํตํด์ ํ๋ ค๊ณ ํจ.
#include <string>
#include <vector>
#include <iostream>
#include <tuple>
#include <map>
#include <algorithm>
using namespace std;
struct jaeryo
{
int m1;
int m2;
int m3;
int m4;
int cost;
};
//๊ฐ์ฅ ์์ cost์ด๋ฏ๋ก
int MAX = 987654321;
int main()
{
int n;
cin >> n;
// ๊ฐ์ ๋น์ฉ์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ, ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒ์ด๋ฏ๋ก,
// ์ ๋ ฌ์ ํด์ผ ํจ.
jaeryo input;
cin >> input.m1 >> input.m2 >> input.m3 >> input.m4;
// tuple ๋ณด๋ค๋ struct๋ฅผ ์ฌ์ฉํ์.
map<int, jaeryo>m;
for (int i = 0; i < n; ++i)
{
jaeryo j;
cin >> j.m1;
cin >> j.m2;
cin >> j.m3;
cin >> j.m4;
cin >> j.cost;
m.insert(make_pair(i, j));
}
/*
for (auto iter : m)
{
cout << "์ฌ๋ฃ : " << iter.first << " ๋ฒ, ";
cout << "๋จ๋ฐฑ์ง : " << iter.second.m1;
cout << "์ง๋ฐฉ : " << iter.second.m2;
cout << "ํ์ํ๋ฌผ : " << iter.second.m3;
cout << "๋นํ๋ฏผ : " << iter.second.m4;
cout << "๊ฐ๊ฒฉ : " << iter.second.cost;
cout << endl;
}
*/
// ์ต์ข
์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ ๋ณ์๋
// cost์ ์ฌ๋ฃ์ ๋ฒํธ๋ค์ ์์ธ๋ฐ
// ์ฌ๋ฃ์ ๋ฒํธ๋ค์ด 2๊ฐ์ผ ์ ์๊ณ , 3๊ฐ ์ผ ์๋ ์๊ณ ,,
multimap<int, vector<int>, greater<int>>result;
// ๋นํธ๋ง์คํน์ผ๋ก ๊ฐ 6๊ฐ๋ฅผ ๋๋ฉด์
// ๋ง์ฝ์ ์กฐ๊ฑด์ ์ผ์นํ ๊ฒฝ์ฐ
// ๋ฒกํฐ์๋ค๊ฐ ์ผ๋จ ๋ฃ์.
for (int i = 0; i < (1 << n); ++i)
{
// i๋ฅผ ๊ฐ์ง๊ณ ๋ชจ๋ ์ฌ๋ฃ์ธ n๊ณผ
// ๊ฐ ์์๊ฐ 1์ผ ๊ฒฝ์ฐ, ์ฆ ํด๋น ์ฌ๋ฃ ์ฌ์ฉ ์ ๋ฌด๋ฅผ
// ์ฒดํฌํ๋ฉด์ sum์ ๊ณ์ฐ
jaeryo sum;
sum.m1 = 0;
sum.m2 = 0;
sum.m3 = 0;
sum.m4 = 0;
// ๋ถ๋ณ์๋ฅผ ์ ์๊ฐํ๋๋ฉด?
// ๋ฒกํฐ์ ๋ค์ด์ค๋ ๊ฐ์ ์๊ธฐ ์ํด์ ์ฌ์ฉํจ...
//vector<bool>check(n, false);
vector<int>kk;
int tempCost = 0;
for (int j = 0; j < n; ++j)
{
// ๊ฐ ์์์์ ์ฌ๋ฃ ์ ํ ํ ๊น? ๋ง๊น ์ฒดํฌ ํ๋ ๋ถ๋ถ
if (i & (1 << j))
{
//ํด๋น ์๋ฆฌ์ ์ฌ๋ฃ๋ฅผ ์ ํํ ๊ฒฝ์ฐ, ํฉ์ ๊ตฌํ๋ค.
sum.m1 += m[j].m1;
sum.m2 += m[j].m2;
sum.m3 += m[j].m3;
sum.m4 += m[j].m4;
//check[j] = true;
tempCost += m[j].cost;
kk.push_back(j);
}
}
// ์กฐ๊ฑด๊ณผ ํ์ธํ์.
if (sum.m1 >= input.m1 && sum.m2 >= input.m2
&& sum.m3 >= input.m3 && sum.m4 >= input.m4)
{
if (MAX >= tempCost)
{
MAX = tempCost;
result.insert(make_pair(tempCost, kk));
}
}
}
//๋ฉํฐ๋งต์ ์ธ๋ฑ์ค ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํจ...
if (result.empty())
cout << "-1";
else
{
// ์ ์ฒด ํ์ธํ๊ธฐ
for (auto iter : result)
{
cout << "cost : ";
cout << iter.first << endl;
cout << "์ฌ๋ฃ์ ๋ฒํธ๋ค ";
for (int i = 0; i < iter.second.size(); ++i)
{
cout << iter.second[i] + 1;
cout << " ";
//cout << ",";
}
cout << endl;
//break;
}
}
}
1๋ฒ : second๊ฐ ์ ๋ ฌ์ ํด์ผํ๋๋ฐ, multimap ์์ฒด๋ง์ผ๋ก๋ ๋ถ๊ฐ๋ฅํจ. ๋ค๋ฅธ stl์ ๋ง๋ถ์ฌ์ ํด์ผํจ.
2๋ฒ : cost ๊ฐ์ด 0์ด๋ฏ๋ก ์ธ๋ฑ์ค 0์ผ๋ก ์ ๊ทผํ๋ ค๊ณ ํ๋๋ฐ,,,
multi_map์ ์ธ๋ฑ์ค ์ ๊ทผ์ด ์๋จ.....
: ์ค๋ณต์ด ์์ด์ multi_map์ ์ฌ์ฉํ๋ ค๊ณ ํ์ผ๋, ๋ฌธ์ ์ ๋ค์ด ๋ง์.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์.
#include <string>
#include <vector>
#include <iostream>
#include <tuple>
#include <map>
#include <algorithm>
#include <list>
using namespace std;
struct jaeryo
{
int m1;
int m2;
int m3;
int m4;
int cost;
};
//๊ฐ์ฅ ์์ cost์ด๋ฏ๋ก
int MAX = 987654321;
int main()
{
int n;
cin >> n;
// ๊ฐ์ ๋น์ฉ์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ, ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒ์ด๋ฏ๋ก,
// ์ ๋ ฌ์ ํด์ผ ํจ.
jaeryo input;
cin >> input.m1 >> input.m2 >> input.m3 >> input.m4;
// tuple ๋ณด๋ค๋ struct๋ฅผ ์ฌ์ฉํ์.
map<int, jaeryo>m;
for (int i = 0; i < n; ++i)
{
jaeryo j;
cin >> j.m1;
cin >> j.m2;
cin >> j.m3;
cin >> j.m4;
cin >> j.cost;
m.insert(make_pair(i, j));
}
/*
for (auto iter : m)
{
cout << "์ฌ๋ฃ : " << iter.first << " ๋ฒ, ";
cout << "๋จ๋ฐฑ์ง : " << iter.second.m1;
cout << "์ง๋ฐฉ : " << iter.second.m2;
cout << "ํ์ํ๋ฌผ : " << iter.second.m3;
cout << "๋นํ๋ฏผ : " << iter.second.m4;
cout << "๊ฐ๊ฒฉ : " << iter.second.cost;
cout << endl;
}
*/
// ์ต์ข
์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ ๋ณ์๋
// cost์ ์ฌ๋ฃ์ ๋ฒํธ๋ค์ ์์ธ๋ฐ
// ์ฌ๋ฃ์ ๋ฒํธ๋ค์ด 2๊ฐ์ผ ์ ์๊ณ , 3๊ฐ ์ผ ์๋ ์๊ณ ,,
map<int, vector<vector<int>>>result;
// ๋นํธ๋ง์คํน์ผ๋ก ๊ฐ 6๊ฐ๋ฅผ ๋๋ฉด์
// ๋ง์ฝ์ ์กฐ๊ฑด์ ์ผ์นํ ๊ฒฝ์ฐ
// ๋ฒกํฐ์๋ค๊ฐ ์ผ๋จ ๋ฃ์.
for (int i = 0; i < (1 << n); ++i)
{
// i๋ฅผ ๊ฐ์ง๊ณ ๋ชจ๋ ์ฌ๋ฃ์ธ n๊ณผ
// ๊ฐ ์์๊ฐ 1์ผ ๊ฒฝ์ฐ, ์ฆ ํด๋น ์ฌ๋ฃ ์ฌ์ฉ ์ ๋ฌด๋ฅผ
// ์ฒดํฌํ๋ฉด์ sum์ ๊ณ์ฐ
jaeryo sum;
sum.m1 = 0;
sum.m2 = 0;
sum.m3 = 0;
sum.m4 = 0;
// ๋ถ๋ณ์๋ฅผ ์ ์๊ฐํ๋๋ฉด?
// ๋ฒกํฐ์ ๋ค์ด์ค๋ ๊ฐ์ ์๊ธฐ ์ํด์ ์ฌ์ฉํจ...
//vector<bool>check(n, false);
vector<int>kk;
//list<int>kk;
int tempCost = 0;
for (int j = 0; j < n; ++j)
{
// ๊ฐ ์์์์ ์ฌ๋ฃ ์ ํ ํ ๊น? ๋ง๊น ์ฒดํฌ ํ๋ ๋ถ๋ถ
if (i & (1 << j))
{
//ํด๋น ์๋ฆฌ์ ์ฌ๋ฃ๋ฅผ ์ ํํ ๊ฒฝ์ฐ, ํฉ์ ๊ตฌํ๋ค.
sum.m1 += m[j].m1;
sum.m2 += m[j].m2;
sum.m3 += m[j].m3;
sum.m4 += m[j].m4;
//check[j] = true;
tempCost += m[j].cost;
kk.push_back(j);
}
}
// ์กฐ๊ฑด๊ณผ ํ์ธํ์.
if (sum.m1 >= input.m1 && sum.m2 >= input.m2
&& sum.m3 >= input.m3 && sum.m4 >= input.m4)
{
if (MAX >= tempCost)
{
MAX = tempCost;
//result.insert(make_pair(tempCost, kk));
result[tempCost].push_back(kk);
}
}
}
//๋ฉํฐ๋งต์ ์ธ๋ฑ์ค ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํจ...
if (result.empty())
cout << "-1";
else
{
// ์ ์ฒด ํ์ธํ๊ธฐ
//for (auto iter : result)
//{
// cout << "cost : ";
// cout << iter.first << endl;
//
// cout << "์ฌ๋ฃ์ ๋ฒํธ๋ค ";
// for (int i = 0; i < iter.second.size(); ++i)
// {
// cout << iter.second[i] + 1;
// cout << " ";
// //cout << ",";
// }
// cout << endl;
// //break;
//}
}
}