美文网首页
背包九讲学习笔记与例题(三)

背包九讲学习笔记与例题(三)

作者: 风之旅人c | 来源:发表于2020-03-08 15:49 被阅读0次

3 多重背包问题

3.1 题目

N 种物品和一个容量为 V的背包。第 i 种物品最多有M_i件可用,每件耗费的 空间是 C_i,价值是 W_i。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。

3.2 朴素算法

我们可以讲M_i个物品拆分,则得到\Sigma M_i个物品。将原问题转化成01背包问题,时间复杂度为O(V\Sigma M_i)
状态转移方程为:
dp[i][v] = max(dp[i-1][v-k*C_i] + k*W_i ), 0<=k<=N_i

3.3 优化

利用二进制思想,讲第i种物品分成若干件物品,可以有(C_i, W_i), (C_i*2, W_i*2), (C_i*4, W_i*4),等等。这样n件物品至多拆分成logn件物品。

for (int i = 1; i <= n; i++) {
    int num = min(p[i], V / w[i]);
    for (int k = 1; num > 0; k <<= 1) {
        if (k > num) k = num;
        num -= k;
        for (int j = V; j >= w[i] * k; j--)
            f[j] = max(f[j], f[j - w[i] * k] + v[i] * k);
    }
}

3.4 例题

洛谷P1776 宝物筛选

#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int n, m;
int a, b, c, cnt;
int dp[100000];
int v[100000];
int w[100000];

int main()
{
    scanf("%d%d",&n, &m);
    
    for(int i=1; i<=n; ++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        for(int j=1; j<=c; j<<=1)
        {
            v[++cnt] = j*a;
            w[cnt] = j*b;
            c -= j;
        }
        if(c)
        {
            v[++cnt] = c*a;
            w[cnt] = c*b;
        }
    }
    
    for(int i=1; i<=cnt; ++i)
    {
        for(int j=m; j>=w[i]; --j)
        {
            dp[j] = max(dp[j-w[i]] + v[i], dp[j]);
        }
    }
    cout<<dp[m]<<endl;
    
    
    return 0;
} 

相关文章

  • 背包九讲学习笔记与例题(三)

    3 多重背包问题 3.1 题目 有 种物品和一个容量为 的背包。第 i 种物品最多有件可用,每件耗费的 空间是 ...

  • 背包九讲学习笔记与例题(二)

    2.完全背包问题 2.1 题目 有 种物品和一个容量为 的背包,每种物品都有无限件可用。放入第种物品 的费用是 ...

  • 背包九讲学习笔记与例题(一)

    1. 01背包问题 1.1 题目描述 有个物品和一个容量位的背包。放入第件物品耗费的费用为,得到的价值是。求解放入...

  • 背包九讲学习笔记

    从上到下顺序遍历 01背包问题 使用二维数组 01背包问题 空间复杂度优化 使用一维数组 重点:此处必须从后往前遍...

  • 完全||多重背包

    完全背包和01背包的区别在于完全背包里的每一件物品的数量有无数个。模板 与01背包类似的模板 模板题 一大波例题来...

  • 《背包九讲》笔记

    背包问题 题意:给出背包的容量,以及一批物品的价值和大小,求最大价值。 01背包问题 题意 每个物品只能放入一次。...

  • 5-17分数的简单分拆

    裂差公式 例题一 ☆☆: 例题二 ☆☆☆: 例题三☆☆☆: 例题四☆☆☆: 例题五 ☆☆☆: 例题六 ☆☆☆: 例...

  • DP专题整理

    简单DP 背包问题 《背包九讲》笔记 G - 免费馅饼 HDU - 1176 题意 小明初始站在长度为10的数轴上...

  • 背包问题(完全背包)

    动态规划合集: 1.矩阵链乘法2.投资组合问题3.完全背包问题4.01背包问题5.最长公共子序列 例题3——背包问...

  • 《易效能时间管理100讲》49-50讲学习笔记by木木

    《易效能时间管理100讲》49-50讲学习笔记by木木 第 49讲:【反思】连接想法与行动的三个问句 【金句摘要】...

网友评论

      本文标题:背包九讲学习笔记与例题(三)

      本文链接:https://www.haomeiwen.com/subject/caiddhtx.html