导引问题-食堂就餐

现有餐券1张,面值10元。

菜肴N种:炸鸡腿8元;大排5元;荷包蛋:4元;炒青菜:3元;番茄炒蛋:4元……

餐券的特点:一次性使用,不找零;

问:若每种菜只能选一个,为了充分发挥餐券的作用,最多可以消费多少元?

什么是背包问题:

背包问题的基本模型:

给你一个容量为V的背包和若干种物品,在一定的限制条件下(每种物品都占用一定容量),问最多能放进多少价值的物品?

此类问题为指数级的问题

背包问题:

1.最典型、最基本的DP问题;

2.理解并熟练掌握背包问题意义重大;

3.DP问题中“状态”概念的理解;

4.背包的每个容量就是“状态”(思考一下杯子倒水问题中的状态转移);

背包问题的分类

1)01背包

2)完全背包

3)多重背包

4)二维费用背包

5)混合三种背包

6)分组背包

7)有依赖的背包

一、01背包

01背包(最基础的背包问题):

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

问题特点:每种物品仅有一件,可以选择放或不放;

思考:在每个物品都有可能被选中的前提下,如何构造“子问题”?

无序变有序的方法:依次考虑前1、前2、前3...前i个物品;

状态定义:f[i][v]表示前i件物品放入一个容量为v的背包可以获得的最大价值。

例1:题目链接:Problem - 2602 (hdu.edu.cn)

Sample Input

1

5 10

1 2 3 4 5

5 4 3 2 1

Sample Output

14

解题代码

#include<bits/stdc++.h>
using namespace std;int dp[1001],w[1000],c[1000];
int main()
{int num,n,V,i,j;cin>>num;while(num--){cin>>n>>V;for(int i=0;i<n;i++)cin>>w[i];for(int i=0;i<n;i++)cin>>c[i];memest(dp,0,sizeof(dp));for(int i=0;i<n;i++)for(int j=V;j>=c[i];j--)dp[j]=max(dp[j],dp[j-c[i]]+w[i]);cout<<dp[V];}
} 

运行结果

01问题的伪代码如下:

for i = 1 to n // 所有物品

for j = V to v[i] // 思考:为何没必要循环到0?

dp[j] = max(dp[j],dp[j-v[i]] + w[i]);

空间成功优化到一维V。

二、完全背包

完全背包特点:一种物品可以取无数个

可否转化成01背包问题?

朴素的转化方式是?

回忆01背包为何要对容量按照逆序循环?

和01背包类似,不过就是正着写!

深度思考:这类能不能达到的问题应该怎么实现?

三、多重背包

多重背包特点:

一种物品有C个(既不是固定的1个,也不是无数个)

优化的方法:

运用二进制,进行物品拆分,转化成01背包。

比如:13个相同的物品可分成4组(1,2,4,6)

用这4组可以组成任意一个1~13之间的数!

原理:一个数总可以用2^k表示

而且总和等于13,所以不会组成超过13的数

所以可将一种有C个的物品拆分成:

1,2,4,...,2^(k-1),C-(2^k-1)

然后进行01背包。

优化部分的参考代码:

int t=1;
while(x>=t)
{v[cnt]=a*t;c[cnt++]=b*t;x-=t;t<<=1;
}if(x)
{v[cnt]=a*x;c[cnt++]=b*x;
}

四、二维费用背包

二维费用背包问题:

对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(比如,背包容量、最大承重),求怎样选择物品可以得到最大的价值。

设第i件物品所需的两种代价分别为a[i]和b[i],两种代价可付出的最大值(比如体积和重量)分别为V和U,物品的价值为w[i]。

对应算法:费用加了一维,只需状态也加一维即可!

设f[i][v][u]表示前i件物品付出两种代价分别为v和u时可获得的最大价值,状态转移方程则为:

f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}

背包算法(Knapsack Algorithm)相关推荐

  1. 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)

    文章目录 动态规划算法(Dynamic Programming) 动态规划问题的属性 应用实例:最长公共子序列问题(Longest Common Subsequence, LCS) 贪心算法(Gree ...

  2. 0-1背包问题和部分背包(fractional knapsack)问题分析

    简介 背包问题已经是一个很经典而且讨论很广泛的算法问题了.最近学习到这一部分,打算结合自己思考和编码的过程做一个思考总结.这里主要讨论的0-1背包问题和部分背包问题解决方法背后其实隐藏了两种我们比较常 ...

  3. [100天每天一个算法--第1天] 背包算法

    其实PHP程序员需不需要学算法,要不要深挖算法,一直没个定论.博主本人准大四,在找实习的过程中逐渐发现学习算法的重要性,博主以前在学校的工作室老大说过一句话,熟悉算法,可以让你的天花板更高一些,所以便 ...

  4. HMM——维特比算法(Viterbi algorithm)

    1. 前言 维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给 ...

  5. 分类系列之感知器学习算法PLA 和 口袋算法Pocket Algorithm

    我们有一堆数据,默认他们是线性可分的.  定义f为这个数据分割线的最优解,但是我们不知道他的值.  我们仅有一个函数集H,这个函数一般是无穷大的.我们的目的就是从H中找出一条线g来尽可能的接近f.但是 ...

  6. 反向传播算法 Backpropagation Algorithm

    假设我们有一个固定样本集,它包含 个样例.我们可以用批量梯度下降法来求解神经网络.具体来讲,对于单个样例(x,y),其代价函数为:这是一个(二分之一的)方差代价函数.给定一个包含 个样例的数据集,我们 ...

  7. 疯子的算法总结(二) STL Ⅰ 算法 ( algorithm )

    写在前面: 为了能够使后续的代码具有高效简洁的特点,在这里讲一下STL,就不用自己写堆,写队列,但是做为ACMer不用学的很全面,我认为够用就好,我只写我用的比较多的. 什么是STL(STl内容): ...

  8. 语音识别学习日志 2019-7-17 语音识别基础知识准备6 {维特比算法(Viterbi Algorithm)}

    HMM 维特比算法(Viterbi Algorithm)详细解释参考:http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorith ...

  9. 分布式共识算法 (Consensus Algorithm)

    分布式共识算法 (Consensus Algorithm) 如何理解分布式共识? 多个参与者 针对 某一件事 达成完全 一致 :一件事,一个结论 已达成一致的结论,不可推翻 有哪些分布式共识算法? P ...

  10. Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)

    Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...

最新文章

  1. 深度学习不能取代计算机视觉技术背后的真正原因
  2. /dev/null 位桶
  3. Net平台下的分布式缓存设计
  4. java arraystoreexception_208道高频 Java面试题答案6
  5. Activity service 通信
  6. SNF开发平台WinForm之五-高级查询使用说明-SNF快速开发平台3.3-Spring.Net.Framework
  7. 瓦片地图与geoserver发布
  8. D3 treecluster
  9. MIC检测方式(六)
  10. Eclipse汉化教程
  11. matlab eemd输出,如何使用eemd工具包
  12. 适合程序员的英文名字
  13. RS485两台设备用了半年,今天突然没数了,并上串口一直时不时有多余FF等乱码输出。单独串口接电脑试都正常,共地就正常了
  14. 【游戏】金融帝国2:金融帝国实验室(Capitalism Lab)3.0.19安装包下载
  15. 从一个程序中生成另一个程序(资源法)
  16. 中学计算机社团活动计划,社团活动方案
  17. 某某桥的检测和加固设计
  18. 读书笔记--PRML(1)
  19. 干了一年“元宇宙”,Meta亏了300亿美金
  20. 教你如何从Google Map爬数据(切片)

热门文章

  1. RK 3568 调试配置以太网流程记录
  2. EffectiveC++
  3. C语言 字符串转二维码
  4. VR眼镜的触摸板移动控制
  5. 人工智能开源框架介绍(整理)
  6. 在vuex中访问vue实例
  7. VUE使用DataV适应小屏或者方屏等各种类型的屏幕
  8. 青蛙和癞蛤蟆有什么区别
  9. php网站怎么打包成apk,Android编程实现webview将网页打包成apk的方法
  10. 如何通过API调用EasyPlayer.js播放器的视频实时录像功能?