3269 混合背包

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 钻石 Diamond
 
题目描述 Description

背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少?

输入描述 Input Description

第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限

输出描述 Output Description

1个数Ans表示所装物品价值的最大值

样例输入 Sample Input

2 10

3 7 2

2 4 -1

样例输出 Sample Output

22

数据范围及提示 Data Size & Hint

对于100%的数据,V <= 200000 , N <= 200

思路:
  背包九讲之大集合!
坑点:
  有的是正序枚举(完全背包是正序枚举),有的是逆序枚举(01背包)
上代码:
 
1)全T代码(之样例都是骗人的):
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. using namespace std;
  7.  
  8. const int M = 2e5 + ;
  9. const int N = ;
  10. int V,n;
  11. int dp[M];
  12.  
  13. struct Bag {
  14. int v,w,m;
  15. }t[N];
  16.  
  17. int main()
  18. {
  19. scanf("%d%d",&n,&V);
  20. for(int i=,v,w,m;i<=n;i++)
  21. {
  22. scanf("%d%d%d",&v,&w,&m);
  23. if(m==-) m=V/v;
  24. t[i].v=v,t[i].w=w,t[i].m=m;
  25. }
  26. for(int i=,mi,vi,wi;i<=n;i++)
  27. {
  28. mi=t[i].m,vi=t[i].v,wi=t[i].w;
  29. for(int k=;k<=mi;k++)
  30. for(int j=V;j>=k*vi;j--)
  31. dp[j]=max(dp[j],dp[j-k*vi]+k*wi);
  32. }
  33. printf("%d",dp[V]);
  34. return ;
  35. }

2)正解

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. using namespace std;
  7.  
  8. const int M = 2e5 + ;
  9. const int N = ;
  10. int V,n;
  11. int dp[M];
  12.  
  13. inline void zeroonebag(int v,int w) {
  14. for(int i=V;i>=v;i--)
  15. dp[i]=max(dp[i],dp[i-v]+w);
  16. }
  17.  
  18. inline void completebag(int v,int w) {
  19. for(int i=v;i<=V;i++)
  20. dp[i]=max(dp[i],dp[i-v]+w);
  21. }
  22.  
  23. inline void multibag(int v,int w,int m) {
  24. if(v*m>=V) {
  25. completebag(v,w);
  26. return;
  27. }
  28. int k=;
  29. while(k<=m)
  30. {
  31. zeroonebag(k*v,k*w);
  32. m-=k;
  33. k<<=;///等价于*2
  34. }
  35. zeroonebag(m*v,m*w);
  36. }
  37.  
  38. int main()
  39. {
  40. scanf("%d%d",&n,&V);
  41. for(int i=,v,w,m;i<=n;i++)
  42. {
  43. scanf("%d%d%d",&v,&w,&m);
  44. if(m==)
  45. zeroonebag(v,w);
  46. else
  47. if(m==-)
  48. completebag(v,w);
  49. else
  50. multibag(v,w,m);
  51. }
  52. printf("%d",dp[V]);
  53. return ;
  54. }

codevs3269 混合背包 x的更多相关文章

  1. [codevs3269]混合背包

    题目大意:一道混合背包模板. 解题思路:分三种情况讨论,01和完全没什么问题,多重背包需要把物品分成$\log W[i]$件,然后01即可,分成W[i]件01会TLE. 读优大法好! C++ Code ...

  2. CODEVS3269混合背包+二进制优化

    codevs 3296 http://codevs.cn/problem/3269/ 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至 ...

  3. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

  4. HDU 3535 分组混合背包

    http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...

  5. Codevs 3269 混合背包(二进制优化)

    3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为V ...

  6. HDU 3535 AreYouBusy(混合背包)

    HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...

  7. codevs 3269 混合背包(复习混合背包)

    传送门 [题目大意]给出物品的数量.-1为无限个. [思路]混合背包.... [code] #include<iostream> #include<cstdio> #inclu ...

  8. HDU3535 AreYouBusy 混合背包

    题目大意 给出几组物品的体积和价值,每组分为三种:0.组内物品至少选一个:1.组内物品最多选一个:2.组内物品任意选.给出背包容量,求所能得到的最大价值. 注意 仔细审题,把样例好好看完了再答题,否则 ...

  9. CODE[VS] 3269 混合背包

    3269 混合背包  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 背包体积为V ,给出N ...

随机推荐

  1. MySQL之主键

    一.主键  primary key (唯一标识 .不能重复.不能为空) 1.主键-----是表中的字段,这个字段能唯一标识一条记录.例如 学生表(学号.姓名,年级)里的学号,不能重复.不能为空: 课程 ...

  2. Guava -- 集合类 和 Guava Cache

    Guava -- 集合类 和 Guava Caches 1. 什么是 Guava Guava 是 google 推出的一个第三方 java 库,用来代替 jdk 的一些公共操作,给我印象特别深的就是 ...

  3. inline元素、block元素

    inline元素 不会独占一行,相邻的行内元素会排列在同一行内,直到一行排不下才会换行 高.行高.以及外边距和内边距不可改变 宽度就是它的文字或图片的宽度,不可改变,随元素内容变化而变化 内联元素只能 ...

  4. Java并发编程——线程的基本概念和创建

    一.线程的基本概念: 1.什么是进程.什么是是线程.多线程? 进程:一个正在运行的程序(程序进入内存运行就变成了一个进程).比如QQ程序就是一个进程. 线程:线程是进程中的一个执行单元,负责当前进程中 ...

  5. OSCP-FristiLeaks

    环境搭建 靶机下载: https://www.vulnhub.com/entry/fristileaks-13,133/ 安装:直接用virtualbox打开 网络桥接 找到靶机IP 虚拟机启动就显示 ...

  6. Mybatis和hibernate的优缺点比较

    介绍: Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装. Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于POJO 与S ...

  7. 怎么处理Win7电脑打开软件速度慢的情况?

    很多使用Win7系统的用户都会发现这么一个问题,就是电脑在使用过一段时间后,打开一个应用软件的速度就会变慢,非常耽误时间.下面就和大家分享一个解决Win7系统应用软件打开速度慢的小技巧. Win7系统 ...

  8. python面向编程;类的绑定与非绑定方法、反射、内置方法

    一.类的绑定与非绑定方法 ''' 类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何 ...

  9. three.js之元素周期表

    <html><head> <title>three.js css3d - periodic table</title> <meta charset ...

  10. Android基础相关面试问题-binder面试问题详解

    Linux内核的基础知识: 进程隔离/虚拟地址空间:在操作系统中为了保护某个进程互不干扰就设计了一个叫“进程隔离”的技术,防止进程A可以操作进程B的数据.而进程隔离技术用到了虚拟地址空间,进程A的虚拟 ...