题意:

某Farmer最近买了一个书架,但是由于书架太高,Farmer够不到书架的顶端,现在屌丝Farmer开始通过将自己牧场的牛累起来这样使所累起来的牛能够高于书架的高度,但是努力使垒起来的牛的高度比书架的高度尽量能达到最小,求这个最小值。

解题思路:

初次看到这个题的时候真心的不知道怎么解,虽然感觉和背包有千丝万缕的关系,但是却不知道怎么转换,总是感觉变化了好像就变味了,知道瞥了眼解题报告,瞬间豁然开朗,柳暗花明。。。

其实就是将所有牛的高度加起来,与书架的高度做差得到V,这样再将V作为背包的体积,然后在转化为01背包就好了,此处注意在这里没有价值这个变量,所以在循环的时候,将体积作为价值就好了,这样的话装完后其实简单的要命,只不过当时没有转化过来,这可能是这道题的精髓吧

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{int T,N,V,V1;//T为测试数据个数 N为物品个数  V为背包所容纳的体积int f[1000005],vol[50], tem;//f记录i体积下的能盛下的最大价值    vol[i] 第i件物品的体积   val[i]记录第i件物品的价值 int i,j;scanf("%d %d",&N,&V1);int  sum=0;for(i = 0 ; i < N ; i++){scanf("%d",&vol[i]);sum = sum + vol[i];}V=sum-V1;//cout<<"sum:"<<sum<<"  V"<<V<<endl;memset(f,0,sizeof(f));for(i = 0 ; i < N ; i++)  //便利i件物品{for(j = V ; j >= vol[i]; j--){tem = f[ j-vol[i] ] + vol[i];if( f[j] < tem )f[j] = tem;}}cout<<V-f[V]<<endl;return 0;
}

我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。

如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。

如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。

为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-∞了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了。

这个小技巧完全可以推广到其它类型的背包问题,后面也就不再对进行状态转移之前的初始化进行讲解。

小结

01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。故一定要仔细体会上面基本思路的得出方法,状态转移方程的意义,以及最后怎样优化的空间复杂度。

对于此类经典的01背包,为了和完全背包区别开来,简单的看是不够的,并且很难想出其代码的区别和本质区别,下面就通过实际的数值来区分(其实代码的本质区别就是01背包从体积大的开始遍历,这样的话就不能一件物品多次放置,而完全背包就不同了,是从体积最小的开始遍历,这样的话就会出现一件物品多次放置的特点,这样也就凸显了两种背包的不同,但是这两种都是最基本的背包雏形)

假设测试用例:

物品编号

0

1

2

3

4

体积

3

4

5

6

7

价值

5

6

7

8

9

01背包运行过程:

完全背包运行过程:

具体完全背包案例: Piggy-Bank (完全背包)

01背包与完全背包(对比)相关推荐

  1. hdu 3732(01背包转多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包..最多也就11*11=121件 ...

  2. 背包问题教程-01背包,完全背包,多重背包,混合背包 收藏

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...

  3. 01背包、完全背包、多重背包问题的C++实现及路径记录

    这里主要实现路径记录,只求最值问题移步 01背包.完全背包.多重背包问题的C++实现 以下均打印输出路径,即装入背包的物品序号,和最大值. 01背包问题 #include <iostream&g ...

  4. 01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,背包问题求方案数

    1 01背包问题 有 NNN 件物品和一个容量是 VVV 的背包.每件物品只能使用 一次. 第 iii 件物品的体积是 viv_ivi​,价值是 wiw_iwi​.求解将哪些物品装入背包,可使这些物品 ...

  5. 01背包和完全背包 的完整讲解版 包含 一维数组实现 和二维数组实现题目

    (二)01背包和完全背包 的完整讲解版 包含 一维数组实现 和二维数组实现题目 //有N件物品和一个容量为V的背包.第i件物品的体积是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. ...

  6. 01背包, 完全背包,多重背包

    优秀博文01背包https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 背包问题泛指以下这一种问题: 给定一组有固定价值和固定重量的 ...

  7. 背包问题(01背包,完全背包,多重背包(朴素算法二进制优化))

    写在前面:我是一只蒟蒻~~~ 今天我们要讲讲动态规划中~~最最最最最~~~~简单~~的背包问题 1. 首先,我们先介绍一下  01背包 大家先看一下这道01背包的问题   题目   有m件物品和一个容 ...

  8. 01背包、完全背包(异同)

    背包问题 01背包 例题和状态转移方程 二维解法 一维解法 完全背包 例题和状态转移方程 二维解法 一维解法 01背包和完全背包的异同 01背包问题和完全背包问题的差别在于:01背包的每个物品只有一个 ...

  9. 动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包

    动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包 01背包 && 完全背包 && 分组背包 の 视频教程:https://www.bilibi ...

  10. 背包问题,为什么使用倒叙、顺序分别优化01背包和完全背包.

    一.背景 0-1背包与完全背包的唯一的区别在于0-1背包每个物品只能使用一次,但是完全背包可以重复使用. 二.0-1背包空间优化 假设物品编号1~n i号物品重量w[i] i号物品价值v[i] 以下分 ...

最新文章

  1. [bzoj3673/3674可持久化并查集加强版]
  2. 定位AI交互技术服务商,声智科技完成近亿元A轮融资,将拓展安防、汽车等新场景
  3. OA办公系统的核心-工作流
  4. 使用各种方法加速大型矩阵运算的效率对比
  5. HttpServletRequest 对象
  6. P3327 [SDOI2015]约数个数和 (mobius反演)
  7. css类选择器类名覆盖优先级
  8. 翻译:程序员数据结构基础:选择正确的数据结构
  9. 出现在海马#30524;前的c++
  10. 信息学奥赛一本通(1012:计算多项式的值)
  11. NOI训练行动路线图
  12. Svchost进程应用技巧
  13. JSP实用教程 第三章 JSP内置对象
  14. 网络诊断显示“DNS服务器可能不可用”
  15. Cocoa动画编程指南
  16. 逻辑回归分析实训----乳腺癌肿瘤预测
  17. Web前端--HTML+CSS+JavaScript响应式网络科技网页设计
  18. hids Elastic Security 系列1-Elastic Security介绍
  19. FairyGUI个人使用手册 只有重点(1)
  20. oracle磁带的使用期限,存储的损耗 关于磁带寿命的一些探讨

热门文章

  1. tomcat 乱码问题
  2. 【高等数学】函数连续、可导、可微,洛必达法则使用条件、一阶可导、一阶连续可导、二阶可导、二阶连续可导
  3. npm安装包报错,清除一下缓存
  4. 【万人千题】誓要成为刷题界的卷王王中王
  5. 大点干!早点散----------深入剖析GFS分布式文件系统
  6. pandas中强大的绘制图表功能——DataFrame.hist(),以及统计分析函数——DataFrame.describe()
  7. spring boot 集成xxl-job 学习总结
  8. GDPR对ITSM的影响
  9. 小型数控钻铣床C31
  10. 冒泡排序法(C语言)