[[problem:PACKING]]
다이나믹프로그래밍으로 cache[from][limit]으로 메모이제이션을 써서 최대 절박도의 합을 구했고, cache에 저장된 값을 토대로 마지막에 cache[i][limit] 과 cache[i+1][limit]을 비교해가며 이용된 물건을 찾아주었습니다.
문제의 기본 테스트 셋은 답이 잘 나왔고 그 이외에 기본 테이타셋으로 데이타가 하나인 경우 볼륨이 캐리어 용량이 클때와 작을때 모두 올바른 결과를 얻어냈구요 모든 데이타셋이 캐리어 용량보다 큰경우에 대해서도 0 0을 찍어내도록 만들었습니다. 어떤 경우에 예외사항이 있는지 모르겠네요ㅜㅜ도와주세요
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
#include<string>
#include<string.h>
using namespace std;
short cache[100][1000];
vector<short> volume;
vector<short> importance;
short solve(int from, int limit){
short& ret = cache[from][limit];
if ((from == volume.size() - 1) && volume[from] <= limit) return ret = importance[from];
if ((from == volume.size() - 1) && volume[from] > limit) return ret = 0;
short minimum = volume[from];
for (int i = from + 1; i < volume.size(); ++i)
minimum = min(minimum, volume[i]);
if (minimum > limit) return ret = 0;
if (ret != -1) return ret;
if (volume[from]<=limit)
ret = importance[from] + solve(from + 1, limit - volume[from]);
ret = max(ret, solve(from + 1, limit));
return ret;
}
int main(){
int cases; cin >> cases;
while (cases--){
int numOfItems, volumeOfCarrier;
cin >> numOfItems >> volumeOfCarrier;
vector<string> items(numOfItems);
volume.resize(numOfItems);
importance.resize(numOfItems);
int count = 0;
while (numOfItems--){
cin >> items[count] >> volume[count] >> importance[count];
count++;
}
memset(cache, -1, sizeof(cache));
//itemsIndex.clear();
cout << solve(0, volumeOfCarrier);
vector<int> itemsIndex;
int volumeLimit = volumeOfCarrier;
if (items.size() == 1 && volume[0] <= volumeOfCarrier) cout << ' ' << 1 << endl << items[0] << endl;
else if (*min_element(volume.begin(), volume.end()) > volumeOfCarrier) cout << ' ' << 0 << endl;
else{
for (int i = 0; i < items.size() - 1; ++i){
if (cache[i][volumeLimit] >cache[i + 1][volumeLimit]){
itemsIndex.push_back(i); volumeLimit -= volume[i];
}
}
if (cache[items.size() - 1][volumeLimit] == importance[items.size() - 1]) itemsIndex.push_back(items.size() - 1);
cout << ' ' << itemsIndex.size() << endl;
for (int i = 0; i < itemsIndex.size(); ++i)
cout << items[itemsIndex[i]] << endl;
}
}
}
kiyeon88
[[problem:PACKING]]
다이나믹프로그래밍으로 cache[from][limit]으로 메모이제이션을 써서 최대 절박도의 합을 구했고, cache에 저장된 값을 토대로 마지막에 cache[i][limit] 과 cache[i+1][limit]을 비교해가며 이용된 물건을 찾아주었습니다.
문제의 기본 테스트 셋은 답이 잘 나왔고 그 이외에 기본 테이타셋으로 데이타가 하나인 경우 볼륨이 캐리어 용량이 클때와 작을때 모두 올바른 결과를 얻어냈구요 모든 데이타셋이 캐리어 용량보다 큰경우에 대해서도 0 0을 찍어내도록 만들었습니다. 어떤 경우에 예외사항이 있는지 모르겠네요ㅜㅜ도와주세요
11년 전