PACKING 문제 뭐가 문젠지 모르겠어요... yennie #include <stdio.h> int n, w; char things[101][22]; char chosen[101][22]; int weight[101], wish[101]; int opt[101][1001], chidx; int calc(int idx, int wgt) { if (idx == n || wgt > w) return 0; if (wgt + weight[idx] > w) return opt[idx][wgt] = calc(idx + 1, wgt); if (opt[idx][wgt] != -1) return opt[idx][wgt]; int c1 = calc(idx + 1, wgt + weight[idx]) + wish[idx], c2 = calc(idx + 1, wgt); return opt[idx][wgt] = (c1 > c2 ? c1 : c2); } void footprint(int st, int w) { if (opt[st][w] <=0 || st == n) return; if (opt[st + 1][w] == opt[st][w]) footprint(st + 1, w); else if (opt[st + 1][w + weight[st]] == (opt[st][w] - wish[st])) { sprintf(chosen[chidx++], "%s", things[st]); footprint(st + 1, w + weight[st]); } } int main() { int c; scanf("%d", &c); while (c--) { scanf("%d %d", &n, &w); chidx = 0; for (int i = 0; i < n; i++) { scanf("%s %d %d", things[i], &weight[i], &wish[i]); for (int j = 0; j <= w; j++) opt[i][j] = -1; } printf("%d ", calc(0, 0)); footprint(0, 0); printf("%d\n", chidx); for (int i = 0; i < chidx; i++) { printf("%s\n", chosen[i]); } } } calc는 dp로 최대 절박도를 계산하고 footprint는 cache 따라가면서 어떤 아이템을 선택했는지 찾는건데... 책이랑 다른 점도 없는 것 같은데 왜 자꾸 오답이 나오는지 모르겠어요... 8년 전
1개의 댓글이 있습니다. seico75 이런 입력은 어떨까요? 1 6 10 A 1 10 B 2 20 C 100 100 D 3 30 E 4 40 F 5 50 8년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
yennie
calc는 dp로 최대 절박도를 계산하고
footprint는 cache 따라가면서 어떤 아이템을 선택했는지 찾는건데...
책이랑 다른 점도 없는 것 같은데 왜 자꾸 오답이 나오는지 모르겠어요...
8년 전