0
点赞
收藏
分享

微信扫一扫

4. 多重背包问题 I

妖妖妈 2022-03-11 阅读 46

Powered by:NEFU AB-IN

Link

文章目录

4. 多重背包问题 I

  • 题意

  • 思路

    多重背包:每件物品最多用 s i s_i si

    01背包: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − v [ i ] ] + w [ i ] ) f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]) f[i][j]=max(f[i1][j],f[i1][jv[i]]+w[i])
    朴素完全背包: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j − v [ i ] ∗ k ] + k ∗ w [ i ] ) f[i][j] = max(f[i - 1][j - v[i] * k] + k * w[i]) f[i][j]=max(f[i1][jv[i]k]+kw[i]) k = 0 , 1 , 2 , . . . k = 0, 1, 2, ... k=0,1,2,...
    优化后的完全背包: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − v [ i ] ] + w [ i ] ) f[i][j] = max(f[i - 1][j], f[i][j - v[i]] + w[i]) f[i][j]=max(f[i1][j],f[i][jv[i]]+w[i])
    朴素多重背包: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j − v [ i ] ∗ k ] + k ∗ w [ i ] ) f[i][j] = max(f[i - 1][j - v[i] * k] + k * w[i]) f[i][j]=max(f[i1][jv[i]k]+kw[i]) k = 0 , 1 , 2 , . . . s [ i ] k = 0, 1, 2, ... s[i] k=0,1,2,...s[i]

    相比朴素完全背包,有了取件的限制

  • 代码

    朴素版本

    '''
    Author: NEFU AB-IN
    Date: 2022-03-06 11:58:08
    FilePath: \ACM\Acwing\4.py
    LastEditTime: 2022-03-06 12:06:39
    '''
    n, m = map(int, input().split())
    
    N = 110
    v, w, s = [0] * N, [0] * N, [0] * N
    dp = [[0] * N for _ in range(N)]
    
    for i in range(1, n + 1):
        v[i], w[i], s[i] = map(int, input().split())
    
    for i in range(1, n + 1):
        for j in range(0, m + 1): #体积从0开始枚举
            k = 0
            while k <= s[i] and k * v[i] <= j:
                dp[i][j] = max(dp[i][j], dp[i - 1][j - v[i] * k] + w[i] * k)
                k += 1
    
    print(dp[n][m])
    
举报

相关推荐

0 条评论