题目大意:

em.... 就是多重背包

挑战340页的东西 ...自己的笔记总结总是比较乱的

重点:原始的状态转移方程中 更新第 i 种物品时 重量%w[i] 的值不同 则它们之间是相互独立的;

1--- 就是说在考虑第 i 种物品拿几个时,w[i]+1 与 2*w[i]+1 与...与 k*w[i]+1 相互之间是有关联的

  但 w[i]+j ... k*w[i]+j (j不为1) 与 w[i]+1 是相互独立 无关的,即%w[i]的值不同时 相互独立

2--- 那么可以将 w[i]+j 与 2*w[i]+j 与...与 k*w[i]+j 的最优解都压在 j 中,因为只要知道 j 的最优解

  并且知道 k(个数),就知道 k*w[i]+j的最优解 = j的最优解 + k*v[i]

用双端队列维护不同余数 j 的最优解,采用题目 滑动最小值 的方法维护 m[i]个物品在不同重量区间 的最大值

#include <bits/stdc++.h>
using namespace std;
int n,W,w[],v[],m[],dp[];
int deq[],deqv[]; // 模拟deque deq保存下标 deqv保存值
int main()
{
int t;
while(~scanf("%d",&t)) {
while(t--) {
scanf("%d%d",&n,&W);
for(int i=;i<n;i++)
scanf("%d%d%d",&w[i],&v[i],&m[i]);
memset(dp,,sizeof(dp));
for(int i=;i<n;i++) // 第i种物品
for(int j=;j<w[i];j++) { // 枚举不同余数
int head=, tail=;
/// 双端队列维护余数为 j 时的最优解
// 则每个 j 开始时都应该赋0清空队列 for(int k=;k*w[i]+j<=W;k++) { // 枚举该物品个数
int nowv=dp[k*w[i]+j]-k*v[i];
/// 原本重量为 k*w[i]+j 的最优解
// 可能其他种物品有更新过该重量的最优解
/// 压到 j 时对应的最优解 while(head<tail && deqv[tail-]<=nowv) tail--;
/// 与曾中出现过存放在队列中的最优解比较 deq[tail]=k, deqv[tail++]=nowv; // 更新队列 队头head对应的即为最优解
dp[k*w[i]+j]=deqv[head]+k*v[i]; // 更新dp[]保存的最优解 if(deq[head]==k-m[i]) head++;
/// 如果head对应的已经是m[i]个中的第一个
/// 即到下一个时 head对应的物品数量会超出m[i]的限制
/// 则应该舍弃这个最优解 把队头head移向下一位
}
}
printf("%d\n",dp[W]);
}
} return ;
}

多重背包 /// 单调队列DP oj1943的更多相关文章

  1. [BZOJ4182]Shopping (点分治+树上多重背包+单调队列优化)

    [BZOJ4182]Shopping (点分治+树上多重背包+单调队列优化) 题面 马上就是小苗的生日了,为了给小苗准备礼物,小葱兴冲冲地来到了商店街.商店街有n个商店,并且它们之间的道路构成了一颗树 ...

  2. BZOJ.4182.Shopping(点分治/dsu on tree 树形依赖背包 多重背包 单调队列)

    BZOJ 题目的限制即:给定一棵树,只能任选一个连通块然后做背包,且每个点上的物品至少取一个.求花费为\(m\)时最大价值. 令\(f[i][j]\)表示在点\(i\),已用体积为\(j\)的最大价值 ...

  3. POJ 1742 Coins(多重背包, 单调队列)

    Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...

  4. 【POJ1276】Cash Machine(多重背包单调队列优化)

    大神博客转载http://www.cppblog.com/MatoNo1/archive/2011/07/05/150231.aspx多重背包的单调队列初中就知道了但一直没(不会)写二进制优化初中就写 ...

  5. Luogu 3423 [POI 2005]BAN-银行票据 (多重背包单调队列优化 + 方案打印)

    题意: 给出 n 种纸币的面值以及数量,求最少使用多少张纸币能凑成 M 的面额. 细节: 好像是要输出方案,看来很是头疼啊. 分析: 多重背包,裸体??? 咳咳,好吧需要低调,状态就出来了: dp [ ...

  6. bzoj 1531 Bank notes 多重背包/单调队列

    多重背包二进制优化终于写了一次,注意j的边界条件啊,疯狂RE(还是自己太菜了啊啊)最辣的辣鸡 #include<bits/stdc++.h> using namespace std; in ...

  7. poj1742 Coins(多重背包+单调队列优化)

    /* 这题卡常数.... 二进制优化或者单调队列会被卡 必须+上个特判才能过QAQ 单调队列维护之前的钱数有几个能拼出来的 循环的时候以钱数为步长 如果队列超过c[i]就说明队头的不能再用了 拿出来 ...

  8. hdu 2844 多重背包+单调队列优化

    思路:把价值看做体积,而价值的大小还是其本身,那么只需判断1-m中的每个状态最大是否为自己,是就+1: #include<iostream> #include<algorithm&g ...

  9. POJ 3017 单调队列dp

    Cut the Sequence Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8764   Accepted: 2576 ...

随机推荐

  1. bzoj1015题解

    [题意分析] 给你一张无向图,要求支持删点和询问连通块数. [解题思路] 可以直接可持久化并查集大力艹过去. 考虑到正着删点就是倒着加点,所以并不需要可持久化.复杂度O((k+m)α(n)). [参考 ...

  2. Python self的用法

    1)不加self是局部变量,只在这个方法里有效:加self则是实例变量,相当于别的函数定义的变量你实例化出来就可以使用 #coding:utf-8 class Person: def __init__ ...

  3. Delphi全面控制Windows任务栏

    使用Windows95/NT/98操作系统的用户知道:Windows正常启动后,在电脑屏幕下方出现一块 任务栏.从系统功能角度而言,整个任务栏包括几个不同的子区域,从左至右依次是:开始 按钮.应用程序 ...

  4. java 直接调用micorosoft office (2003-2007和2010版本)中excel中计算函数

    主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx 读取excel和MySQL相关: java的poi技 ...

  5. NX二次开发-UFUN工程图表格注释检索默认单元格首选项UF_TABNOT_ask_default_cell_prefs

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  6. php 类静态变量 和 常量消耗内存及时间对比

    在对类执行100w次循环后, 常量最快,变量其次,静态变量消耗时间最高 其中: 常量消耗:101.1739毫秒 变量消耗:2039.7689毫秒 静态变量消耗:4084.8911毫秒 测试代码: cl ...

  7. ARC032 D - アットコーダーモンスターズ

    https://arc032.contest.atcoder.jp/tasks/arc032_4# 切比雪夫距离,放在3000*3000的平面上, 一个集合就是恰好包含这个集合的矩形,价值是矩形长.宽 ...

  8. 在centos6.5 上安装最新版mysql

    在mysql上如果直接安装mysql安装的不是5.6版本以上.下面记录怎么解决安装最新版mysql5.6以上. 1.查看本机都安装了mysql什么版本:rpm -qa | grep mysql,默认是 ...

  9. Spring AOP源码分析(二):AOP的三种配置方式与内部解析实现

    AOP配置 在应用代码中,可以通过在spring的XML配置文件applicationContext.xml或者基于注解方式来配置AOP.AOP配置的核心元素为:pointcut,advisor,as ...

  10. de4Dot用法 解决 .net程序 reflecter反编译 “索引超出了数组界限”问题

    de4Dot 反混淆工具.当你反编译 .net写的dll 或exe时出现:索引超出了数组界限 问题时 可以去网上下这个工具,通过cmd命令 打开de4dot的exe 空格 dll的全路径. 这样 :D ...