dd大牛的文章中这样提到P02: 完全背包问题
题目
有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

基本思路
这个问题非常类似于01背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。如果仍然按照解01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程,像这样:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<= v}。这跟01背包问题一样有O(N*V)个状态需要求解,但求解每个状态的时间则不是常数了,求解状态f[i][v]的时间是O(v/c[i]),总的复杂度是超过O(VN)的。

将01背包问题的基本思路加以改进,得到了这样一个清晰的方法。这说明01背包问题的方程的确是很重要,可以推及其它类型的背包问题。但我们还是试图改进这个复杂度。

一个简单有效的优化
完全背包问题有一个很简单有效的优化,是这样的:若两件物品i、j满足c[i]<=c[j]且w[i]>=w[j],则将物品j去掉,不用考虑。这个优化的正确性显然:任何情况下都可将价值小费用高得j换成物美价廉的i,得到至少不会更差的方案。对于随机生成的数据,这个方法往往会大大减少物品的件数,从而加快速度。然而这个并不能改善最坏情况的复杂度,因为有可能特别设计的数据可以一件物品也去不掉。

转化为01背包问题求解
既然01背包问题是最基本的背包问题,那么我们可以考虑把完全背包问题转化为01背包问题来解。最简单的想法是,考虑到第i种物品最多选V/c [i]件,于是可以把第i种物品转化为V/c[i]件费用及价值均不变的物品,然后求解这个01背包问题。这样完全没有改进基本思路的时间复杂度,但这毕竟给了我们将完全背包问题转化为01背包问题的思路:将一种物品拆成多件物品。

更高效的转化方法是:把第i种物品拆成费用为c[i]*2^k、价值为w[i]*2^k的若干件物品,其中k满足c[i]*2^k<V。这是二进制的思想,因为不管最优策略选几件第i种物品,总可以表示成若干个2^k件物品的和。这样把每种物品拆成O(log(V/c[i]))件物品,是一个很大的改进。但我们有更优的O(VN)的算法。 * O(VN)的算法这个算法使用一维数组,先看伪代码: <pre class"example"> for i=1..N for v=0..V f[v]=max{f[v],f[v-c[i]]+w[i]};

你会发现,这个伪代码与P01的伪代码只有v的循环次序不同而已。为什么这样一改就可行呢?首先想想为什么P01中要按照v=V..0的逆序来循环。这是因为要保证第i次循环中的状态f[i][v]是由状态f[i-1][v-c[i]]递推而来。换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个绝无已经选入第i件物品的子结果f[i-1][v-c[i]]。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果f[i][v-c[i]],所以就可以并且必须采用v= 0..V的顺序循环。这就是这个简单的程序为何成立的道理。

这个算法也可以以另外的思路得出。例如,基本思路中的状态转移方程可以等价地变形成这种形式:f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]},将这个方程用一维数组实现,便得到了上面的伪代码。

总结
完全背包问题也是一个相当基础的背包问题,它有两个状态转移方程,分别在“基本思路”以及“O(VN)的算法“的小节中给出。希望你能够对这两个状态转移方程都仔细地体会,不仅记住,也要弄明白它们是怎么得出来的,最好能够自己想一种得到这些方程的方法。事实上,对每一道动态规划题目都思考其方程的意义以及如何得来,是加深对动态规划的理解、提高动态规划功力的好方法。

2.完全背包问题 Acwing 03

有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。

第 i 种物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10

朴素版解法:二维空间解法
也是两种选择,选或不选,只不过每个物品可以选无限次,在01的基础上把
f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i])改为f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i])

#include<iostream>
#include<cstring>
#include<algorithm>|using namespace std;const in N =1010;int f[N][N];
int w[N];
int v[N];
int n,m;
int main()
{cin>>n>>m;for(int i=0;i<n;i++)scanf("%d%d",&v[i],&w[i]);for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){f[i][j]=f[i-1][j];if(j>=v[i])f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i]);} }cout<<f[n][m]<<endl;return 0;
}

优化空间版解法:二维转化为一维空间
转移方程为f[j]=max(f[j],f[j-v[i]]+w[i])
第二层从小到大循环,原因参考01的一维

/* f[i]表示 总体积是i的情况下,最大价值是多少。result = max{f[0...m]}for(int i =0;i<n;i++)
{for(int j =v[i];j<= m;j++)f[j] = max(f[j],f[j-v[i]]+w[i]);
}数学归纳法:
1.假设考虑前i-1个物品之后,所有的f[j]都是正确的
2.来证明:考虑完第i个物品后,所有的f[j]也都是正确的对于某个j而言,如果最优解中包含k个v[U]:f[j - k * v[i]];f[k -(k - 1)*v[i] -v[i]]+w[i]]包含1个v[i]...
f[j] f[j-v[i]]+w[i]*/#include<iostream>
#include<cstring>
#include<algprithm>using namespace std;const int N =1010;int f[N];
int n,m,w,v;
int main()
{cin>>n>>m;for(int i=0;i<n;i++){cin>>v>>w;for(int j=v;j<=m;j++){f[j]=max(f[j],f[j-v]+w);} }cout<<f[m]<<endl;return 0;
}

背包九讲----02完全背包问题相关推荐

  1. 背包九讲之一:01背包问题

    文章目录 说明: 01背包问题 题目 基本思路 初始化的细节问题 优化空间复杂度 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添 ...

  2. 完全背包问题python_令人头疼的背包九讲(2)完全背包问题

    重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题. 题目 完全背包问题 题目要求 有n ...

  3. 背包九讲之二:完全背包问题

    文章目录 说明: 完全背包问题 题目 基本思路 一个简单有效的优化 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添翼:背包九讲, ...

  4. dd大牛的背包九讲-背包问题汇总

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

  5. 第二讲 完全背包问题(对背包九讲的学习)

    学习自:背包九讲 题目 有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. ...

  6. 【算法】动态规划+“背包九讲”原理超详细讲解+常见dp问题(9种)总结

    目录 一.动态规划(DP) 二.背包九讲 (1)完全背包 P1616 疯狂的采药(完全背包) (2)01背包 滚动数组 一维数组 P1048 采药(01背包) 01背包表格图示 (3)多重背包 整数拆 ...

  7. dp背包九讲(待补充,暂时前两讲)

    文章目录 背包九讲 一.01背包 二维dp 优化为一维 二.完全背包 二维dp 优化为一维 三.多重背包 数据范围很小时,变成01背包暴力 当数据范围较大时,利用二进制优化 二进制优化还不够用时,利用 ...

  8. 算法--背包九讲(详细讲解+代码)

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

  9. dalao的背包九讲

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

  10. 【转】《背包九讲》--崔添翼大神

    背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物 ...

最新文章

  1. NCBI-SRA数据下载
  2. 当年只会C# 所以写C++就成这样了! log4cplus - log4net
  3. 2016 中国互联网仿冒态势分析报告
  4. 如何在SAP WebClient UI里使用HANA Live report
  5. postman--安装及Interceptor插件
  6. ipmitool介绍_ipmitool管理工具
  7. 2.5 VB编程基础--运算符和表达式
  8. php dbc2000操作类,超详细菜鸟入门第一课DBC2000详细架设
  9. android 手势截图,小米8手机如何截图/长截屏/手势截屏?小米8四种截图方法
  10. 岩板铺地好吗_卧室铺地板还是瓷砖好 这里给你答案
  11. 基于数据挖掘的智能停车场运营数据分析系统
  12. python pip 的安装、更新、卸载、降级、和使用 pip 管理包
  13. 在eclipse中修改tomcat端口
  14. Python验证角谷猜想
  15. 异构计算(CPU + GPU)编程简介
  16. 六世班禅仓央嘉措的诗
  17. 如何在计算机上注销一个用户登录,如何取消Microsoft账户登录电脑
  18. 常用清新蓝花背景word通用个人简历模板
  19. 吲哚菁绿ICG标记海藻酸钠|ICG-海藻酸钠|alginate-Indocyaninegreen
  20. 解决liunx进程杀不死的问题

热门文章

  1. Vmware中安装win7虚拟机以及相关简单知识
  2. WordPress简单好看的线报主题baolog
  3. 吴恩达深度学习环境配置
  4. python语言是编程还是脚本_编程语言和脚本语言有什么区别?
  5. cad页面布局快捷键_cad设置快捷键(cad快捷键在哪里修改设置)
  6. 计算机视觉中的对象跟踪(完整指南)
  7. Linux可执行文件
  8. 四阶龙格库塔法的基本思想_经典四阶龙格库塔法解1阶微分方程组.doc
  9. 双线性映射(密码学常用算法)
  10. rand()函数实现原理:线性同余法