강의
[고급-8] 동적테이블 응용3
Mosu(정종인)
2017. 1. 11. 10:14
반응형
선물
n개의 선물을 한명씩 적절하게 분배.
조건 1 : 각자의 부피는 [길동>=길순>=길삼]을 만족하도록분배한다.
조건 2 : 다음의 d가 최소가 되도록 한다. d=(길동선물 부피의 합)-(길삼 선물의 부피 합)
조건 3 : 같은 d가 되는 배분방법이 여럿일 경우에는 길동의 선물의 부피 합이 적은 방법을 선택한다.
W=a+b+c
1~k까지의 선물을 받았을 때, 길순이가 부피 b, 길삼이가 부피 c를 받을 상태는 존재하는가?
a=W-(b+c)
a값을 굳이 저장 안해도 구할 수 있다는 사실!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <cstdio> int n, W, G[21], A, B, C, ans=987654321; bool DT[21][2001][2001]; int main(){ scanf("%d", &n); for(int i=1; i<=n; ++i){ scanf("%d", G+1), W+=G[i]; } DT[0][0][0] = true; for(int i=1; i<=n; ++i){ for(int a=0; a<=2000; ++a){ for(int b=0; b<=2000; ++b){ DT[i][a][b] = (DT[i-1][a][b] || (a-G[i]<0?false : DT[i-1][a-G[i]][j]) || (b-G[i]<0?false : DT[i-1][a][b-G[i]])); } } } for(int a=0; a<=2000; ++a){ for(int b=0; b<=2000; ++b) if(DT[n][a][b]){ if(W-(a+b) >= a && a >= b && W-(a+b)-b <= ans) ans = W-(a+b) - b, A=W-(a,b), B=a, C=b; } } printf("%d %d %d\n", A, B, C); return 0; } | cs |
반응형