9.3.1 多阶段决策问题

  • 9.4 物品无限的背包问题

无权变成有权,本质上背包问题就是有向带权图,即DAG + weighted.

  • 9.5 0-1 背包问题
c    for(int i = n; i >=1 ; i--)
        for(int j = 1; j <= n; j++)
        {
            dp[i][j] = i == n ? 0 : dp[i+1][j];
            if(j >= V[i]) 
                dp[i][j] = max(dp[i][j], dp[i+1][j-V[i]] + W[i]);
        }

9.3.2 规划方向

  • 下面这种dp有利于不存边,进而扩展到滚动数组.
  • 边界方面,i=0时为0,j<0时为负无穷,最终答案为f(n,C).
c    for(int i = 1; i <=n ;i++)
        for(int j = 0; j <= C; j++)
        {
            f[i][j] = (i == 1 ? 0 : f[i-1][j]);
            if(j >= V[i]) f[i][j] = max(f[i][j], f[i-1][j-V[i]] + W[i]);
        }

9.3.3 滚动数组

把f变为一维数组,本质上还是那么理解,只是之前的元素还没有被覆盖

c    memset(f, 0, sizeof(f));
    for(int i = 1; i <= n; i++)
    {
        scanf("%d%d", &V, &W);
        for(int j = C; j >= 0; j--)
            if(j >= V) f[j] = max(f[j], f[j-V] + W);
    }

svtter
209 声望37 粉丝

更喜欢原型开发


引用和评论

0 条评论