背包问题(Knapsack Problem)

问题描述

一个旅行者随身携带一个背包,可以放入背包的物品有 n 种,每种物品的重量和价值分别为wi,vi。如果背包的最大重量限制是 b, 每种物品可以放多个。怎样选择放入背包的物品以使得背包的价值最大? 设上述wi,vi,b 都是正整数。

问题建模

解是 < x1, x2,…, xn >,其中 xi 是装入背包的第 i 种物品个数。

线性规划问题:由线性条件约束的线性函数取最大或最小的问题。
整数规划问题:线性规划问题的变量 xi 都是非负整数。

子问题界定和计算顺序

子问题界定:由参数 k 和 y 界定
k:考虑对物品 1, 2, … , k 的选择。
y:背包总重量不超过 y。

原始输入:k = n,y = b。
子问题计算顺序:k = 1,2, … , n 对于给定的 k,y = 1, 2, … ,b.

优化函数的递推方程

Fk(y):装前 k 种物品,总重不超过 y,背包达到的最大价值。

标记函数

ik(y):装前k种物品,总重不超y,背包达到最大价值时装入物品的最大标号

实例

追踪解

时间复杂度

备忘录需计算nb项,每项常数时间,计算时间为O(nb) .

代码实例

题目描述:
有N件物品和一个容量为V的背包。第i件物品的价值是C[i],重量是W[i]。求解将哪些物品装入背包可使价值总和最大。

输入描述:
输入第一行数 N V (1 <=N <=500) (1<= V <= 10000)
输入 N 行 两个数字 代表 C W (1 <= C <= 50000, 1 <= W <=10000)

示例

输入
5 10
8 6
10 4
4 2
5 4
5 3输出
19

代码实现

#include <iostream>
#include <vector>
using namespace std;int main()
{int N,V;while(cin >> N >> V){vector<int> value(N);//存储每个物品的价值vector<int> capacity(N);//存储每个物品的容量for(int i = 0; i < N; ++i){cin >> value[i] >> capacity[i];}vector<vector<int>> dp(N+1,vector<int>(V+1,0));//有N+1行,但是从1开始遍历,所以每行表示每个物品//有V+1列,但是从1开始遍历,所以每列表示从1开始到最大容量 的 各种情况下 的 物品最大价值存储for(int i = 1; i < N+1; ++i){for(int j = 1; j < V+1; ++j){if(capacity[i-1] > j)//如果不下,那就等于上次的最优存储{//这里的capacity[i-1]是因为这里的i从1开始dp[i][j] = dp[i-1][j];}else//如果能放下,有两种情况:1、放 2、不放//放和不放取决于放了之后是否是最优的,于是创建一个临时变量。{//dp[i-1][j-capacity[i-1]]:i-1:上面一行,j-capacity[i-1]:装了i-1这个物品之后还剩的容量。//所以整体就是:当前的tmp_best == 装了i-1物品的价值 + 装了这个物品后剩余的容量还可以装的最优的方案int tmp_best = value[i-1] + dp[i-1][j-capacity[i-1]];dp[i][j] = max(tmp_best,dp[i-1][j]);}}}//返回最后一个元素就是最优的方案cout << dp[N][V] << endl;}return 0;
}

动态规划应用举例_背包问题相关推荐

  1. 动态规划算法问题分析_背包问题_求相隔数据之间最大和_算法理解

    动态规划如何选取一维数组还是二维数组 总结: * 当题目种涉及到两个变量时需要借助二维数组来实现动态规划,例如 背包问题中,涉及容量和重量两个变量,则需要两个维度来考虑 * 当题目中只有一个变量时,使 ...

  2. ACM杂题——动态规划_背包问题

    ACM杂题K - I NEED A OFFER!--动态规划_背包问题优化解法 题目描述 Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校 ...

  3. 运筹学动态规划matlab代码,运筹学胡运权清华版-7-04动态规划应用举例

    <运筹学胡运权清华版-7-04动态规划应用举例>由会员分享,可在线阅读,更多相关<运筹学胡运权清华版-7-04动态规划应用举例(45页珍藏版)>请在人人文库网上搜索. 1.第四 ...

  4. 动态规划:关于01背包问题 I

    动态规划:关于01背包问题,你该了解这些! 对于面试的话,其实掌握01背包,和完全背包,就够用了,最多可以再来一个多重背包. 如果这几种背包,分不清,我这里画了一个图,如下: 至于背包九讲其其他背包, ...

  5. 动态规划的用法——01背包问题

    动态规划的用法--01背包问题 问题主题:著名的01背包问题 问题描述: 有n个重量和价值分别为wi.vi的物品,现在要从这些物品中选出总重量不超过W的物品,求所有挑选方案中的价值最大值. 限制条件: ...

  6. 【动态规划】0/1背包问题

    问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec  内存限制: 64 MB 提交: 152  解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...

  7. 动态规划——物品无限的背包问题

    动态规划--物品无限的背包问题 物品无限的背包问题.有nn种物品,每种均有无穷多个.第i种物品的体积为ViV_i,重量为WiW_i.选一些物品装到一个容量为CC的背包中,使得背包内物品在总体积不超过C ...

  8. 【动态规划】P1048 01背包问题:采药

    时间对应容量,用01背包 [动态规划笔记]01背包问题及优化_m0_52043808的博客-CSDN博客 代码: #include<iostream> using namespace st ...

  9. 玉米社:什么是长尾关键词_举例_拓词方法思路

    什么是长尾关键词_举例_拓词方法思路 长尾关键词主要针对核心关键词而言,给核心关键词加上前缀.后缀.中间修辞词,即形成相应的长尾关键词. 例如,你的核心词为网络营销培训,那么深圳网络营销培训.专业网络 ...

最新文章

  1. Windows内存管理和linux内存管理
  2. 大佬来告诉你在遇到B站崩了,如何防止类似事故的出现?
  3. Linux基础第一周
  4. 创建和触发Notification
  5. nslookup默认服务器修改,Nslookup命令的使用 - [详细]
  6. springboot html压缩,springboot 请求响应压缩
  7. ElementUI table组件,表格组件,单击单元格可编辑逻辑
  8. jquery-尺寸相关
  9. 不论报任何错误 都是网络源有问题,安装spacemacs报错的解决方式
  10. 三层交换机启用OSPF后,如何实现数据转发路径
  11. 区块链学者Michael Goldstein:比特币可以防止能源浪费
  12. 【POJ 2279】Mr. Young’s Picture Permutations【线性DP】
  13. 计算机二级考试办公软件高级应用题型,计算机二级考试题型
  14. 雷电模拟器无法桥接网络解决办法
  15. c语言编写时钟图案,用C语言绘制电子时钟图案
  16. 芯片,建立在沙粒上的帝国!
  17. 一分钟了解什么是代理ip和api接口
  18. 解决springboot无法访问此网站,springboot启动后无法访问网站
  19. 重启mysql的命令 linux_linux重启mysql命令
  20. node初探 什么是node

热门文章

  1. HDU 4562 守护雅典娜
  2. 我科学家引入信息论 刷新基因测序精度
  3. LC-1732. 找到最高海拔
  4. 【PlatON三大银河战役之合约抢滩登陆战开战!】
  5. 服务器03系统在win10的电脑花屏,win10系统屏幕开机花屏的原因和解决方法
  6. C++ 实现安卓手机拍照全景模式
  7. 使用CSS为图片添加边框的几种方法
  8. 为什么戴耳机听歌时候耳朵痛?科学佩戴耳机远离耳类疾病
  9. Linux应该起飞了
  10. IP网络地址子网划分