题目大意:

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 ;
}

最新文章

  1. 2016年iOS笔试题
  2. Android成长日记-Android四大组件之Service组件的学习
  3. Smarty3学习笔记
  4. [ios][swift]Swift - 常用文件目录路径获取(Home目录,文档目录,缓存目录等)
  5. C# int.Parse()、int.TryParse()与Convert.ToInt32()的区别
  6. DLL文件无法删除怎么解决
  7. C# 线程池的使用
  8. 项目总结-timerTask的使用
  9. 【dp】友好城市
  10. PLSQL Developer中文乱码问题
  11. 使用CCS调试基于AM335X的SPL、Uboot(原创)
  12. 听闻 kubernetes,快速了解一番
  13. java从命令行接受多个数字求和输出
  14. windows7(64位) PHP APACHE MYSQL
  15. JavaScript String 对象常用方法
  16. 什么是虚拟DOM?
  17. Libusb学习
  18. ZOJ3084_S-Nim
  19. js中不能做变量名的字符
  20. 《深入理解mybatis原理4》 MyBatis缓存机制的设计与实现

热门文章

  1. Linux如何删除特殊字符文件名或目录?
  2. bzoj 2751
  3. 单调栈(最大子矩形强化版)——牛客多校第八场A
  4. NX二次开发-UFUN打开信息窗口UF_UI_open_listing_window()
  5. 从yjz那里偷来的fread读入挂
  6. Excel的数据分析—排位与百分比
  7. Day9 - 异步IO\数据库\队列\缓存
  8. libevent的使用 32位 64位
  9. iOS开发系列-自动化分发测试打包
  10. 一个好的mvc5+ef6的学习地址