문제 해결
01 + 배낭 보드 녹화 경로. 경로는 오히려 전용 레코드로부터 검색된 멀티 솔루션 구성 가능한 작은 값의 경화에 의한 솔루션의 집합이다. 1 차원 배열로, 경로를 사용하여 기록 될 수 없음 [중량 현재 = 문서 번호, 마지막에 기록 된 준수 여부가 해결 될 수 있기 때문이다. 이 기록 경로의 2 차원 배열이되도록, 경로 [부품 번호] [현재의 중량] = 1이므로 솔루션 레코드의 다수의 세트가 될 수있다. 시간이 솔루션의 최소 세트를 발견하는 데 필요한의, 그래서 01 배낭을 용이하게하기 위해, 첫 번째 동전 내림차순를 가지고 있기 때문에, 당신은 솔루션을 내림차순으로 업데이트 할 수 있습니다.
코드
#INCLUDE <비트 / stdc ++ H.>
사용 스페이스 성병;
INT (DP) [ 150 ], 동전 [ 10005 ]로 [ 10005 ] [ 150 ];
값 int ) (주
{
INT I, J, N, M, 인덱스;
벡터 < INT > ANS;
scanf와 ( " % D % D " , N, M);
대 (ⅰ = 1 ; I <= N; I ++ )
는 scanf ( " %의 D " , 코인 [I]);
정렬 (코인 + 1 코인 + N + 1큰 < INT > ());
대해 (ⅰ = 1 ; I <= N은, I ++ )
{
대한 (j = M, J> = 코인 [I] j-- )
{
경우 (DP [J] <= DP [J 코인 [I]는 + 코인 [내가])
{
DP [J] = DP [J 코인 [I] + 코인 [I];
경로 [I] [J] = 참 ;
}
}
}
인덱스 = N은;
경우 (DP [M] == M)
{
동안 (M)
{
경우 (경로 [N] [M])
{
ans.push_back (코인 [N]);
M - = 코인 [N];
}
N - ;
}
종류 (ans.begin (), ans.end ());
대해 (ⅰ = 0 ; 나는 <ans.size (); I ++ )
의 printf ( " % D % C " , ANS는 [I] I ans.size == () - 1 ? ' \ n ' : ' ' );
}
다른 사람
의 printf ( " 해결책 \ n을 " );
시스템 ( " 정지 " );
반환 0 ;
}