C++动态规划算法之0-1背包问题
0-1背包问题
- 题目描述
有 n 件物品, 每件物品有一个价值和一个重量,分别记为: b1,b2, …bn w1,w2, …wn 其中所有的 重量wi 均为整数。 现有一个背包,其最大载重量为W,要求从这n件物品中任取若干件(这些物品要么被装入要么被留下)。问背包中装入哪些物品可使得所装物品的价值和最大?
- 输入
第1行:2个整数n(1<=n<=1000)和W(1<=W<=10000),分别表示物品的件数和背包的最大载重量。
第2-n+1行:每行2个用空格分开的整数,第i+1行的整数表示第i件物品的重量wi和价值bi(1<=bi,wi<=10000)。
- 输出
第1行:1个整数,表示背包所能装下的物品的最大总价值。
第2-?行:每行3个用空格分开的整数,i, wi, bi,分别表示最优解中的物品的编号、重量和价值。
- 样例输入
4 5 2 3 3 4 4 5 5 6
- 样例输出
7 1 2 3 2 3 4
- 题目分析
这道题是背包问题的其中一种,除此之外还有部分背包问题、完全背包问题、多重背包问题等,我就不一一介绍了。所谓0-1背包问题,0就是指不要此件物品,1就是指要这件物品,也就是说你不能像部分背包问题那样把物品分开。而且每种物品只有一件,不可以像完全背包问题、多重背包问题那样有很多件。这道题还在原来的基础上要求了输出物品序号,对生活中的我们都更加实用。话不多说,下面是代码:#include<cstdio> #include<iostream> using namespace std; int N,W,b[1002],w[1002],f[1002][10002]; void wxy(int i,int j) {if(!i) return ;if(w[i]>j||f[i-1][j]>=f[i-1][j-w[i]]+b[i])wxy(i-1,j);else{wxy(i-1,j-w[i]);cout<<i<<" "<<w[i]<<" "<<b[i]<<endl;} } int main() {cin>>N>>W;for(int i=1;i<=N;i++)cin>>w[i]>>b[i];for(int i=1;i<=N;i++)for(int j=1;j<=W;j++){if(w[i]>j)f[i][j]=f[i-1][j];elsef[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+b[i]);}cout<<f[N][W]<<endl;wxy(N,W); }
C++动态规划算法之0-1背包问题相关推荐
- Java使用动态规划算法思想解决01背包问题
Java使用动态规划算法思想解决背包问题 背包问题是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高 动 ...
- 算法:动态规划算法的最佳实践-背包问题
1.背包问题 有一个背包,容量为4磅,现有如下物品 要求达到的目标为装入的背包的总价值最大 并且重量不超出要求装入的物品不能重复 2.思路分析 背包问题主要是指一个给定容量的背包.若干具有一定价值和重 ...
- 动态规划算法问题分析_背包问题_求相隔数据之间最大和_算法理解
动态规划如何选取一维数组还是二维数组 总结: * 当题目种涉及到两个变量时需要借助二维数组来实现动态规划,例如 背包问题中,涉及容量和重量两个变量,则需要两个维度来考虑 * 当题目中只有一个变量时,使 ...
- 野生前端的数据结构练习(11)动态规划算法
[摘要] dynamic programming被认为是一种与递归相反的技术,递归是从顶部开始分解,通过解决掉所有分解出的问题来解决整个问题,而动态规划是从问题底部开始,解决了小问题后合并为整体的解决 ...
- 动态规划算法据序偶原理求解0/1背包问题(C++实现)
可程序根据序偶原理,应用动态规划算法求解. Code 1//说明:本程序有一定代码冗余,若分割为多个函数的形式会使程序简洁明了. 2#include <iostream> 3u ...
- 算法设计与分析第4章 动态规划(一)【背包问题】
第3章动态规划(一)[背包问题] 基本思想: 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,但是经分解得到的子问题往往不是互相独立的.不同子问题的数目常常只有多项式量级.在用 ...
- 动态规划算法-03背包问题
背包问题 简介 背包问题一个很著名的动态规划问题,也称为0-1背包问题,很多题都是以此为模板进行魔改的. 问题描述 有N个重量为w1,w2,w3,,,wn且价值为v1,v2,v3,,,vn的物品和一个 ...
- 详解:动态规划算法【Java实现】——背包问题
动态规划 动态规划算法介绍 动态规划算法最佳实践-背包问题 思路分析: 图解分析: Java代码实现: 动态规划算法介绍 1)动态规划(Dynamic Programming)算法的核心思想是:将大 ...
- 完全背包问题贪心算法c语言,数据结构与算法学习之路:背包问题的贪心算法和动态规划算法...
一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算 ...
- 总结——01背包问题 (动态规划算法)
0-1 背包问题:给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi . 问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大? 分析一波,面对每个物品,我 ...
最新文章
- 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式
- idea 端口被占用
- Java教程 实战学习Struts实例
- POJ - 2942 Knights of the Round Table (双连通分量)
- 斯坦福大学机器学习第二课 “单变量线性回归”
- django18:auth模块
- css 奇淫技巧 行内快 父级padding 子级margin 抵消
- vcneter5.5添加域用户权限
- LDMS 8.8 简明使用手册之客户端配置及部署
- python学习系列--str类型
- 事物(二)之客户端事务应答匹配
- mac上安装mongoDb以及简单使用
- netperf工具的使用
- python: 校园网登录脚本
- ionic代码压缩与代码混淆
- u盘为什么显示在工具栏而不显示在计算机里,为什么U盘插入后任务栏上显示在我的电脑上不显示...
- 视觉点胶机系统相机、镜头参数与选择
- WPF ScrollViewer 仿苹果 细长 滚动条
- 今日杂谈---重用和程序员
- 2003服务器安全策略