zoukankan      html  css  js  c++  java
  • 背包总结

    0/1背包

    题意

    给一个体积为V的背包,n件物品,每件物品的价值为c[i],体积为v[i],问不超过背包体积可以装的最大价值为多少

    分析

    定义:dp[i][v]:考虑到第i件物品,体积为V(V >= v[i])时的最大价值

    转移:dp[i][v] = max(dp[i-1][v],dp[i-1][v-v[i]] + c[i])

    从转移方程可以看出 dp[v] = max(dp[v], dp[v-a[i]] + c[i])  (需要逆序枚举V!!!)


    完全背包

    题意

    给一个体积为V的背包,n件物品,每件物品的价值为c[i],体积为v[i],问不超过背包体积可以装的最大价值为多少

    分析

    不难看出与0/1背包的区别在于每件物品的数量上,考虑二进制拆分优化

    直接正序枚举v即可(与0/1背包相反)


     分组背包

    题意

    给一个体积为V的背包,n件物品,每件物品有a[i]个,价值为c[i],体积为v[i],问不超过背包体积可以装的最大价值为多少

    分析

    考虑二进制拆分 将a[i] 拆成 : 1,2,4 ...... 2^k,a[i] - 2^(k+1) + 1 共k+1件物品 

        for(int i = 1; i <= n ; i++)
        {
            for(int k = 1; k < a[i]; a[i]-=k, k<<1)
            {
                for(int j = V; j >= k*c[i]; --j)
                {
                    dp[j] = max(dp[j], dp[j-k*v[i] + k*c[i]);
                }
            }
            for(int j = V; j >= a[i]*c[i]; --j)
                 dp[j] = max(dp[j], dp[j-a[i]*v[i]]+a[i]*c[i])
        }
    View Code
    要么优秀要么生锈
  • 相关阅读:
    在Windows Phone应用中使用Google Map替代Bing Map
    《从入门到精通:Windows Phone 7应用开发》
    判断最小割的唯一性
    ASP.NET页面生命周期
    SQL排序
    window.open
    VS2008中英文转换
    asp.net下载文件的常用方法
    TSQL Convert转换时间类型
    TreeView
  • 原文地址:https://www.cnblogs.com/Superwalker/p/7878185.html
Copyright © 2011-2022 走看看