기본적인 아이디어 :
전형적인 01 배낭 문제;
요점 :
요약에 따라;
사용법 #include <iostream> #INCLUDE <stdlib.h> #INCLUDE <STDIO.H> #INCLUDE <벡터> #INCLUDE < 문자열 > #INCLUDE <math.h> #INCLUDE <알고리즘> #INCLUDE <CString을> #INCLUDE <맵 > #INCLUDE <큐> #INCLUDE < 설정 > #INCLUDE <적층> 사용 스페이스 성병; CONST INT maxn = 10010 ; INT의 N, m; INT의 VEC [maxn]; int로 [maxn] DP; 부울선택 [MAXN] MAXN] BOOL CMP ( INT의 A, INT B) { 복귀 A> B] } INT (주) { CIN >> N- m; // INT a 및 대 ( INT I = 1이다. ] I <= N-; I ++ ) { CIN >> VEC [I]; } 정렬 (VEC + 1. , N- + + VEC 1. , CMP); // 초기화 배열 DP; // 용량 / 값 m 대응한다 대 ( INT I는 = 0 ; I는 <= m; I ++는) { // 방전 소자를 나타낸다 전에 0 보류가 0이어야하지 않는다 DP [I] = 0 ; } 대 ( INT I = 1. ; I <= N-; I ++ ) { // 개시 전에 제 n 요소 순환으로, 대 ( INT의 -; V> VEC = [I] V V = m ) { // 배치하면, IF (DP [V] <DP = [V - VEC [I] + VEC [I]) { //이 더 배치하는 경우, 선택은 [I] [V]는 = . 1 ; // 주제 배치 DP [V]를 최대 (DP = [- VEC [I] V] + [V], DP를 VEC [I]) // 또는에 배치되지; } 다른 { 선택 [I] [V] = 0 ; // 주제 배치되지 } } } IF (DP [m]! = m) { // 최적의 솔루션을 생성하지 않으면, COUT << " 해결책 " << ; ENDL } 다른 { // 경우 최적의 수용액; INT K = N-, NUM = 0 , V = m; BOOL 에서 플래그 = true로 , 그동안 (K> = 0 ) { IF (선택 [K] [V] == (1)) { // 进行选择, 경우 (플래그) { COUT << VEC [K]; 플래그 = 거짓 ; } 다른 { COUT << " " << VEC [K]; } V - = VEC [K]; } 케이 - ; } } 반환 0 ; }