ACM:动态规划,01背包问题
题目:
有n件物品和一个容量为C的背包。(每种物品均仅仅有一件)第i件物品的体积是v[i],重量是w[i]。选一些物品装到这个背包中,使得背包内物品在整体积不超过C的前提下重量尽量大。
解法:两种思路:
第一种:d(i, j)表示“把第i,i+1,i+2,...n个物品装到容量为j的背包中的接下来的最大总重量”。
d(i, j) = max{d(i+1, j), d(i+1, j-v[i])+w[i]} 前面一项表示不放第i个物品,后面一项表示放第i个物品。
然后取两者之中最大的那个。
#include <iostream>
#include <string>
using namespace std; const int MAXN = 10000;
int n, C, v[MAXN], w[MAXN];
int d[MAXN][MAXN]; //d(i, j)表示“把第i,i+1,i+2,...n个物品装到容量为j的背包中的接下来的最大总重量” int main() {
cin >> n >> C;
for(int i = 0; i < n; ++i) {
cin >> v[i] >> w[i];
}
memset(d, 0, sizeof(d));
for(int i = n; i >= 1; --i) {
for(int j = 0; j <= C; ++j) {
d[i][j] = (i == n ? 0 : d[i+1][j]); //不放第i个物品
if(j >= v[i]) d[i][j] = max(d[i][j], d[i+1][j-v[i]]+w[i]); //不放第i个物品跟放第i个物品之间的最大值
}
}
cout << d[1][C] << endl;
return 0;
}
另外一种:d(i, j)表示“把前 i 个物品装到容量为 j 的背包中的最大总重量”。
d(i, j) = max{d(i-1, j), d(i-1, j-v[i])+w[i]} 前面一项表示不放第i个物品。后面一项表示放第i个物品。
然后取两者之中最大的那个。
#include <iostream>
#include <string>
using namespace std; const int MAXN = 10000;
int n, C;
int d[MAXN][MAXN]; //d(i, j)表示“把前 i 个物品装到容量为 j 的背包中的最大总重量”。 int main() {
cin >> n >> C;
memset(d, 0, sizeof(d));
int v, w;
for(int i = 1; i <= n; ++i) {
cin >> v >> w;
for(int j = 0; j <= C; ++j) {
d[i][j] = (i == 1 ? 0 : d[i-1][j]); //第i个没放进去
if(j >= v) d[i][j] = max(d[i][j], d[i-1][j-v]+w); //不放第i个物品跟放第i个物品之间的最大值
}
}
cout << d[n][C] << endl;
return 0;
}
ACM:动态规划,01背包问题的更多相关文章
- 动态规划入门-01背包问题 - poj3624
2017-08-12 18:50:13 writer:pprp 对于最基础的动态规划01背包问题,都花了我好长时间去理解: poj3624是一个最基本的01背包问题: 题意:给你N个物品,给你一个容量 ...
- c语言数据结构:01背包问题-------动态规划
两天的时间都在学习动态规划:小作业(01背包问题:) 数据结构老师布置的这个小作业还真是让人伤头脑,自己实在想不出来了便去网上寻找讲解,看到一篇不错的文章: http://www.cnblogs.co ...
- PAT1048. Find Coins(01背包问题动态规划解法)
问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...
- 01背包问题(动态规划)python实现
01背包问题(动态规划)python实现 在01背包问题中,在选择是否要把一个物品加到背包中.必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比較,这样的方式形成的问题导致了很多重叠子问题, ...
- 动态规划专题 01背包问题详解 HDU 2546 饭卡
我以此题为例,详细分析01背包问题,希望该题能够为大家对01背包问题的理解有所帮助,对这篇博文有什么问题可以向我提问,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java ...
- C++动态规划求解0-1背包问题
问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,是的装入背包中物品的总价值最大? 细节须知: 暂无. 算法原理: a.最优子结构性质 ...
- 0-1背包问题——动态规划求解【Python】
动态规划求解0-1背包问题: 问题:背包大小 w,物品个数 n,每个物品的重量与价值分别对应 w[i] 与 v[i],求放入背包中物品的总价值最大. 动态规划核心:计算并存储小问题的最优解,并将这些最 ...
- Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)
传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...
- 动态规划(DP),0-1背包问题
题目链接:http://poj.org/problem?id=3624 1.p[i][j]表示,背包容量为j,从i,i+1,i+2,...,n的最优解. 2.递推公式 p[i][j]=max(p[i+ ...
- 【ACM】Knapsack without repetition - 01背包问题
无界背包中的状态及状态方程已经不适用于01背包问题,那么我们来比较这两个问题的不同之处,无界背包问题中同一物品可以使用多次,而01背包问题中一个背包仅可使用一次,区别就在这里.我们将 K(ω)改为 K ...
随机推荐
- .NET开源项目一览
- C#-GC基础(待补充)
Finalize方法与Dispose方法区别 1. Finalize只释放非托管资源: 2. Dispose释放托管和非托管资源: // D 是神的天敌3. 重复调用Finalize和Dispose是 ...
- LeetCode104_MaximumDepthofBinaryTree Java题解
题目: Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the ...
- 我是怎么从项目中的lib加JAR更换为maven管理的
原来我对maven的使用应该还是去年的时候吧,当时对maven并不感冒(请不要吐槽哈),认为为什么一定要用maven来管理呢,我自己管理jar不是一样么,当时还认为自己管理jar还各种方便还对mave ...
- 关于Blog使用
1.网易博客http://inowtofuture.blog.163.com/blog/#m=0 使用时间:2011年8月-2012年2月 记录内容:主要记录本科參加ACM期间在POJ(北京大学OJ) ...
- 黑马day14 过滤器概述&生命周期&运行过程
过滤器:当訪问一个web资源的时候,过滤器就在你訪问这个web资源的前进行拦截...在放行过后...filter过滤器也能够做一些其它的事情. 编写过滤器的步骤: 1.写一个过滤器类实现filter接 ...
- ThinkPHP5.0框架开发--第4章 TP5.0路由
ThinkPHP5.0框架开发--第4章 TP5.0路由 第4章 TP5.0 路由 ================================================== 上次复习 1. ...
- MHA+ProxySQL 读写分离高可用
文档结构如下: 1.ProxySQL说明 ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加 ...
- ubuntu18.04中安装iNode
title: ubuntu18.04中安装iNode toc: false date: 2018-09-01 17:52:20 categories: methods tags: ubuntu iNo ...
- NPInter数据集的奇葩标号的出坑秘籍
这篇恐怕是有始以来命名最无奈标题了.需要写一下攻略. 业内人士都熟知NPInter,但是该数据库一直以来访问受限.不过终于能访问得到数据集. 但是蛋疼的是2.0的数据库id的命名方法实在奇葩,想了很多 ...