01 가방 문제(DP 동적 계획)

원제


가방 질문


n개의 무게와 가치가 각각 와이,vi인 물품이 있습니다.이 물품들 중에서 총 중량이 W를 초과하지 않는 물품을 골라 모든 선택 방안 중 가치 총화의 최대치를 구한다.
1<=n<=100 
1<=wi,vi<=100
1<=W<=10000

샘플 입력


n=4
(w,v)={(2,3),(1,2),(3,4),(2,2)}
W=5

샘플 출력


7(0, 1, 3번 아이템 선택)

코드


반복 쓰기 (기억 검색)
int n,W;
int w[MAX_N],v[MAX_N]
//     
int dp[MAX_N+1][MAX_N+1];
//  i           j   
int rec(int i,int j)
{
    if(dp[i][j]>=0)
    {
        return dp[i][j];
    }
    int res;
    if(i==n)
    {
        //      
        res=0;
    }
    else if(j

밀어쓰기(역방향)
dp[i][j]는 i번째 아이템부터 총 무게가 j보다 작은 부분을 고르는 것으로 정의됨
dp[n][j]=0
dp[i][j]= dp[i+1][j] (j
dp[i][j]= max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]) (j>=w[i])
4
int n,W;
int w[MAX_N],v[MAX_N]
//DP  
int dp[MAX_N+1][MAX_N+1];
void solve()
{
    for(int j=0;j<=W;j++)
    {
        dp[n][j]=0;
    }
    for(int i=n-1;i>=0;i--)
    {
        for(int j=0;j<=W;j++)
        {
            if(j
점차적 추이법(정방향 진행)
dp[i+1][j]는 이전 i개 아이템 중 총 무게가 j를 초과하지 않는 아이템을 선택할 때 총 가치의 최대치로 정의
dp[0][j]=0
dp[i+1][j]=dp[i][j] 
(j
dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]) (j>=w[i])
4
int n,W;
int w[MAX_N],v[MAX_N]
//DP  
int dp[MAX_N+1][MAX_N+1];
void solve()
{
    for(int j=0;j<=W;j++)
    {
        dp[0][j]=0;
    }
    for(int i=0;i
상태 전환
'전 i개 아이템 중 총 무게가 j를 초과하지 않을 때의 상태 선택'에서'전 i+1개 아이템 중 총 무게가 j를 초과하지 않을 때'와'전 i+1개 아이템 중 총 무게가 j+w[i]를 초과하지 않을 때의 상태 선택'으로 이동합니다.
4
int n,W;
int w[MAX_N],v[MAX_N]
//DP  
int dp[MAX_N+1][MAX_N+1];
void solve()
{
    memset(dp,0,sizeof(dp));
    for(int i=0;i
주: 글의 내용은 에서 기원한다(제2판)




좋은 웹페이지 즐겨찾기