Description

Farmer John recently bought another bookshelf for the cow library, but the shelf is getting filled up quite quickly, and now the only available space is at the top.

FJ has N cows (1 ≤ N ≤ 20) each with some height of Hi (1 ≤ Hi ≤ 1,000,000 - these are very tall cows). The bookshelf has a height of B (1 ≤ BS, where S is the sum of the heights of all cows).

To reach the top of the bookshelf, one or more of the cows can stand on top of each other in a stack, so that their total height is the sum of each of their individual heights. This total height must be no less than the height of the bookshelf in order for the cows to reach the top.

Since a taller stack of cows than necessary can be dangerous, your job is to find the set of cows that produces a stack of the smallest height possible such that the stack can reach the bookshelf. Your program should print the minimal 'excess' height between the optimal stack of cows and the bookshelf.

Input

* Line 1: Two space-separated integers: N and B
* Lines 2..N+1: Line i+1 contains a single integer: Hi

Output

* Line 1: A single integer representing the (non-negative) difference between the total height of the optimal set of cows and the height of the shelf.

Sample Input

5 16
3
1
3
5
6

Sample Output

1
简单的 0,1背包问题
01背包(ZeroOnePack): 有N件物品和一个容量为V的背包。(每种物品均只有一件)第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

01背包(ZeroOnePack): 有N件物品和一个容量为V的背包。(每种物品均只有一件)第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。

用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

把这个过程理解下:在前i件物品放进容量v的背包时,

它有两种情况:

第一种是第i件不放进去,这时所得价值为:f[i-1][v]

第二种是第i件放进去,这时所得价值为:f[i-1][v-c[i]]+w[i]

(第二种是什么意思?就是如果第i件放进去,那么在容量v-c[i]里就要放进前i-1件物品)

最后比较第一种与第二种所得价值的大小,哪种相对大,f[i][v]的值就是哪种。

(这是基础,要理解!)

这里是用二位数组存储的,可以把空间优化,用一位数组存储。

用f[0..v]表示,f[v]表示把前i件物品放入容量为v的背包里得到的价值。把i从1~n(n件)循环后,最后f[v]表示所求最大值。

*这里f[v]就相当于二位数组的f[i][v]。那么,如何得到f[i-1][v]和f[i-1][v-c[i]]+w[i]?(重点!思考) 首先要知道,我们是通过i从1到n的循环来依次表示前i件物品存入的状态。即:for i=1..N 现在思考如何能在是f[v]表示当前状态是容量为v的背包所得价值,而又使f[v]和f[v-c[i]]+w[i]标签前一状态的价值?

逆序!

这就是关键!

1
2
3
for i=1..N
   for v=V..0
        f[v]=max{f[v],f[v-c[i]]+w[i]};

分析上面的代码:当内循环是逆序时,就可以保证后一个f[v]和f[v-c[i]]+w[i]是前一状态的! 此题的代码

#include <stdio.h>
#include <string.h>int dp[1000005],a[10005];int max(int a,int b)
{return a>b?a:b;
}int main()
{int n,m;while(~scanf("%d%d",&n,&m)){int i,j,sum = 0;memset(dp,0,sizeof(dp));memset(a,0,sizeof(a));for(i = 1; i<=n; i++){scanf("%d",&a[i]);sum+=a[i];}for(i = 1; i<=n; i++){for(j = sum; j>=a[i]; j--)dp[j] = max(dp[j],dp[j-a[i]]+a[i]);}for(i = 1; i<=sum; i++){if(dp[i]>=m){printf("%d\n",dp[i]-m);break;}}}return 0;
}

转载于:https://www.cnblogs.com/u013533289/p/4477290.html

POJ3628:Bookshelf 2【01背包】相关推荐

  1. 【 POJ - 3628 】Bookshelf 2(dfs 或 dp,0-1背包)

    题干: Farmer John recently bought another bookshelf for the cow library, but the shelf is getting fill ...

  2. 浅说——九讲背包之01背包

    所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...

  3. Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元

    题意: 规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字.问一共寻在多少种可能.(只要该数的下标不同则认为是不同的序列) ...

  4. 最小邮票数(01背包)

    题目描述 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.     如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可. 输入描述: 有多组数 ...

  5. NYOJ 860 又见01背包

    有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W  的物品,求所有挑选方案中物品价值总和的最大值. 1 <= n <=100 1 <= wi < ...

  6. 背包问题(多重背包+0-1背包)

    一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...

  7. 背包模型dp1:01背包,完全背包,多重背包的两大优化的详解

    01背包问题: 状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j] ...

  8. CF3B Lorry (手动模拟01背包,贪心)难度⭐⭐⭐

    这道题洛谷上的翻译是错的,最后输出格式那里应该是输出一行所选物品的编号,中间用空格隔开 手动模拟01背包 这道题看上去很像是01背包的模板题,但是很明显,v=1e9,正常的01背包是肯定会爆掉62MB ...

  9. 【每日DP】day4 P1417 烹调方案(奇怪的01背包增加了)难度⭐⭐⭐

    P1417 烹调方案 每件物品只有一个,很明显是01背包,但是价值的转换方式不同,是要求 ai−t∗bia_i-t*b_iai​−t∗bi​ 尽可能最大.普通的01背包的价值是不变的,而这一道题目中的 ...

最新文章

  1. c++ 函数指针_开发经验分享(5) 修改Makefile实现C/C++混合编程
  2. 【独家】一文读懂关联分析
  3. Android Audio代码分析7 - stream type
  4. 如何从三流程序员成长为一名年薪50W的架构师(文末附送学习资料)
  5. java解析xml文档_Java解析xml文件
  6. 【清华集训2014】Sum)(类欧几里得算法)
  7. 现身说法“好奇心害死人啊”
  8. python免费课程400节-北京市python儿童学编程
  9. [日期]字符串转Data对象
  10. DevOps使用教程 华为云(15)git如何将本地项目初始化为远程仓库
  11. php 时间转换时间戳_php时间戳转换日期方法总结
  12. IP城域网域内组播功能测试
  13. win7nodejs压缩包配置环境变量
  14. tensorflow学习笔记——获取训练数据集和测试数据集
  15. 商用密码安全性评估简介
  16. Blend 混合模式
  17. HDU - 4960 Another OCD Patient 记忆化
  18. CSS 学习成长笔记(1)
  19. 1468:OKR-Periods of Words(kmp算法)
  20. excel随机数_数据分析常用的excel函数(2)

热门文章

  1. ICCV2021 | 如何高效视频定位?QMUL北大Adobe强强联手提出弱监督CRM,性能SOTA
  2. LFFD 再升级!新增行人和人头检测模型,还有了优化的C++实现
  3. 中国西北大学和北京大学的研究结果是否将终结CAPTCHA验证码时代?
  4. php 企业邮箱,PHPMailer可能被全球邮(企业邮箱提供)拉黑
  5. 他回国后对学生说,玩会这12个游戏就能掌握python基础,其实不难
  6. 程序员何苦为难程序员!
  7. 工程院院士李国杰科学网发文称国内 AI 研究「顶不了天,落不了地」
  8. 图机器学习 | 图信号处理、矩阵分解、随机游走和深度学习算法
  9. 前沿 | 使用Transformers进行端到端目标识别
  10. 论文 | 多传感器数据深度图的融合:最近基于深度学习的方法(下)