Logo xuanxuan0604的博客

博客

部分背包问题

2024-05-26 19:36:53 By xuanxuan0604

动态规划--背包问题

01背包-每件物品一件

dp[i] [j]:从前i件物品中选,背包容量为j时,能装下的最大价值

    ...
    int dp[n+1][bagV+1];
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=bagV;j++){
            if(j<w[i]){
                dp[i][j]=dp[i-1][j];
            }
            else{
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
            }
        }
    }

完全背包-每件物品无限件

dp[i] [j] :从前i件物品中选,第i件物品选k件,背包容量为j时,能装下的最大价值

    ...
    int dp[n+1][bagV+1];
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=bagV;j++){
            for(int k=0;k<=j/w[i];k++){
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]*k]+v[i]*k);
            }
        }  
    }

多重背包-每件物品件数有各自的上限

dp[i] [j]:从前i件物品中选,第i件物品选k件,背包容量为j时,能装下的最大价值

    ...
    int dp[n+1][bagV+1];
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=bagV;j++){
            for(int k=0;k<=p[i]&&k*w[i]<=j;k++){
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]*k]+v[i]*k);
            }    
        }
    }

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。