背包问题

01背包

\(n\)个物品,每个物品都有一个价值和体积,有一个容量为\(V\)的背包,最大可以得到的价值是多少

每个物品都有两种可能,选与不选

code

for(int i = 0; i < n; i++)
{
for(int j = m; j >= w[i]; j--)
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}

背包恰好装满

定义\(dp[i]\)表示\(i\)状态可达,初始化\(dp\)为\(0\),代表不可达,\(dp[0] = 1\),代表可达

状态转移方程\(dp[i] = max(dp[i],dp[i-a[i]])\)

code

for(int i = 1; i <= n; i++)
{
for(int j = V; j >= a[i]; j++)
{
dp[j] = max(dp[j],dp[j-a[i]]);
}
}

完全背包

每个物品可以取任意次,而不是一次,所以我们就不用担心\(01\)背包的状态覆盖问题

直接从\(a[i]\)遍历到\(V\)

code

for(int i=1; i<=n; i++)
{
  for(int j=w[i]; j<=m; j++) //和01背包的唯一区别
  {
  f[j]=max(f[j],f[j-w[i]]+v[i]);
  }
}

多重背包转01背包

多重背包例题

每个物品可以取\(c\)次

二进制优化

我们把\(c\)次划分成\(1,2,4,8...\)之类的数,然后进行\(01\)背包就行了

一定存在某个最优的次数,而划分成二进制一定可以表示成那个数

code

for(int i = 0,a,b,c; i < n; i++)
{
scanf("%d%d%d",&a,&b,&c); //价值,重量,数量
int k = 1;
while(c-k > 0)
{
v[t] = k*a;
w[t++] = k*b;
c -= k;
k *= 2;
}
v[t] = c*a; //把剩下的当成一个物品
w[t++] = c*b;
} //01背包
for(int i = 0; i < t; i++) //t个物品
{
for(int j = m; j >= w[i]; j--)
{
dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
}
}

单调队列优化

二维背包

增加一维就好了,dp[i][j][k] //第i个,花费j,时间k

也可以空间优化,优化掉第一维度

参考博客

https://www.cnblogs.com/-guz/p/9866118.html

dp--01背包,完全背包,多重背包的更多相关文章

  1. HDU 1114 完全背包 HDU 2191 多重背包

    HDU 1114 Piggy-Bank 完全背包问题. 想想我们01背包是逆序遍历是为了保证什么? 保证每件物品只有两种状态,取或者不取.那么正序遍历呢? 这不就正好满足完全背包的条件了吗 means ...

  2. Java实现 蓝桥杯 算法提高VIP 摆花 dp 记忆搜索 2种做法 多重背包

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  3. 01背包模板、全然背包 and 多重背包(模板)

    转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/ ...

  4. DZY Loves Math II:多重背包dp+组合数

    Description Input 第一行,两个正整数 S 和 q,q 表示询问数量.接下来 q 行,每行一个正整数 n. Output 输出共 q 行,分别为每个询问的答案. Sample Inpu ...

  5. POJ1276 - Cash Machine(多重背包)

    题目大意 给定一个容量为M的背包以及n种物品,每种物品有一个体积和数量,要求你用这些物品尽量的装满背包 题解 就是多重背包~~~~用二进制优化了一下,就是把每种物品的数量cnt拆成由几个数组成,1,2 ...

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

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

  7. HDU 2191悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(多重背包)

    HDU 2191悼念512汶川大地震遇难同胞--珍惜如今.感恩生活(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意: 如果你有资金n元, ...

  8. POJ 2392 Space Elevator(贪心+多重背包)

    POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木.每种积木都有一个高度h[i],一个数量num ...

  9. HDU 3732 Ahui Writes Word(多重背包)

    HDU 3732 Ahui Writes Word(多重背包) http://acm.hdu.edu.cn/showproblem.php? pid=3732 题意: 初始有N个物品, 每一个物品有c ...

  10. HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)

    HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...

随机推荐

  1. flask框架(五)——支持正则写法、模板用法、请求响应、session

    如果用正则的话,我们要用自定义的路由. 1导入from werkzeug.routing import BaseConverter 2我先要写一个类,然后继承BaseConverter,然后实现__i ...

  2. Dubbo快速入门 一

    1.分布式基础理论 1.1).什么是分布式系统? “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统” 分布式系统(distributed system)是建立在网络之上的软件 ...

  3. mybatis内置参数及foreach使用

  4. Matlab函数装饰器

    info.m function result_func= info(msg) function res_func =wrap(func) function varargout = inner_wrap ...

  5. Fortify漏洞之Dynamic Code Evaluation: Code Injection(动态脚本注入)和 Password Management: Hardcoded Password(密码硬编码)

    继续对Fortify的漏洞进行总结,本篇主要针对  Dynamic Code Evaluation: Code Injection(动态脚本注入) 和 Password Management: Har ...

  6. C语言编译器

    我们分两部分介绍C语言的编译器,分别是桌面操作系统和嵌入式操作系统. 桌面操作系统 对于当前主流桌面操作系统而言,可使用 Visual C++.GCC 以及 LLVM Clang 这三大编译器. Vi ...

  7. Chrome谷歌浏览器插件-小结

    1.小插件库: Tampermonkey https://chrome.google.com/webstore/detail/tampermonkey-beta/gcalenpjmijncebpfij ...

  8. DRF 筛选

    from rest_framework.generics import ListAPIView,CreateAPIView,UpdateAPIView,RetrieveAPIView,DestroyA ...

  9. [http] http body中chunked数据的编码格式

    一 我们知道,http response的body可以使用chunked编码.这个时候不需要显示的 指定content-length来标记结尾. 如: 我们可以见到编码的chunked字样,并且没有看 ...

  10. [ipsec][crypto] ike/ipsec与tls的认证机制比较

    前言 接上篇:[ipsec][crypto] 有点不同的数字证书到底是什么 本篇内容主要是上一篇内容的延伸.抽象的从概念上理解了证书是什么之后,我们接下来 从实践的角度出发,以IKEv2和TLS两个协 ...