-
여행 짐 싸기알고리즘 풀이/알고리즘 해결전략 연습 2019. 7. 10. 07:10
문제 : https://algospot.com/judge/problem/read/PACKING
코드 ( C ++ ) 종만북 참조
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int N, W;
string name[100];
int volume[100] , need[100];
int cache[1001][101];
int find(int capacity, int item)
{
if (item == N) return 0; // 더 이상 담을 물건이 없을때
int& ret = cache[capacity][item];
if (ret != -1)
return ret;
ret = find(capacity, item + 1); // 이 물건을 담지 않을 경우
if (capacity >= volume[item])
ret = max(ret, find(capacity - volume[item], item + 1) + need[item]); // 이 물건을 담는 경우
return ret;
}
void reconstruct(int capacity, int item, vector<string>& list) // 선택한 물건들의 목록을 list에 저장
{
if (item == N) return; //모든 물건을 고려했을때
if (find(capacity, item) == find(capacity, item + 1)) // item과 item+1의 find가 같다면 name[item]은 고르지 않았을 것
reconstruct(capacity, item+1, list);
else {
list.push_back(name[item]);
reconstruct(capacity-volume[item], item + 1, list);
}
}
int main()
{
int C;
cin >> C;
while (C--)
{
memset(cache, -1, sizeof(cache));
cin >> N >> W;
for (int i = 0; i < N; ++i) {
cin >> name[i] >> volume[i] >> need[i];
}
int maxneed = find(W, 0);
vector<string> list;
reconstruct(W, 0, list);
cout << maxneed << " " << list.size() << endl;
for (int i = 0; i < list.size(); ++i)
cout << list[i] << endl;
}
return 0;
}
'알고리즘 풀이 > 알고리즘 해결전략 연습' 카테고리의 다른 글
드래곤 커브 (0) 2019.07.14 Mismatched Brackets (0) 2019.07.10 비대칭 타일링 (0) 2019.07.07 삼각형 위의 최대 경로 수 세기 (0) 2019.07.07 원주율 외우기 (0) 2019.07.05