POJ-3624-背包问题
它这个问题问的是,在有限的容量下,能装下的最大价值是多少。
所以我们可以递归求解,记忆性递归,用二维数组,但是这样的话就会超内存,所以我们只能用动规来写,而且不能开二维数组,
只能用滚动数组。
我们设一个F数组,大小为13000,它存的是容积为m的背包可放下的最大价值。
我们先假设一个二维数组F [ i ][ j ] ,它表示的意思是,背包里放 i 个物品,最大价值为 j ,它的最大价值。
我们可以知道 F [ i ][ j ] = max ( F [ i-1][ j ] ,F[ i-1][ j-w[i] ] +value [ i ] ) 。
它的意思是,F [ i ][ j ]的值来自于如果不选第 i 个物品,放下值为 j 的包的最大价值,和如果选第 i 个物品,背包里放下 j-weight[i] 大小物品的最大价值和第 i 个物品价值之和,经过比较之后最大的那个值。
我们对于F [ i ][ j ]可以选也可以不选,不选的话,它的价值就是F [ i-1 ][ j ] ,选的话它的价值就是F[ i-1][ j-w[i] ] +value [ i ] ,就是在原背包容积减去 i 物品的重量之后,放入 i-1 个物品的最大价值与 i 物品的价值之和。
不过有个条件,如果 j-w[i] >=0 ,我们才比较求解,小于它的话,我们就让它等于它的上一行同列的值。
好,那么问题来了,这个问题怎么在一维数组中求解呢?
首先我们要知道,在二维数组里面它们的形态:
F[ i-1][ j-w[i] ] F [ i-1][ j ]
F [ i ][ j ] F[ i ][ 2j-w[i] ]
所以说,对于F [ i-1 ][ j ] ,我们还是有用的,我们要用来求右下角的那个元素,我们不能正向,由小到大直接把F [ i-1 ][ j ]覆盖掉,我们应该在用完它时候,再覆盖掉,所以我们从右向左求,就不会伤害任何值了。
代码如下:
#include <iostream>
using namespace std;
int w[3600],d[3600],F[13000];
int main()
{
int n,m;
cin>>n>>m;
for (int i=1;i<=n;i++) {
cin>>w[i]>>d[i];
}
for (int i=1;i<=n;i++) {
for (int j=m;j>=w[i];j--) {
F[j]=max(F[j],F[j-w[i]]+d[i]);
}
}
cout<<F[m]<<endl;
return 0;
}
POJ-3624-背包问题的更多相关文章
- 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)
Charm Bracelet POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...
- poj 3624 Charm Bracelet 01背包问题
题目链接:poj 3624 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即F [i, v]表示前i件物品恰放入一个容量为v 的背包可以 ...
- POJ.3624 Charm Bracelet(DP 01背包)
POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...
- POJ 3624 Charm Bracelet 背包问题的解决方案
最简单的背包问题,标题应该是除了背包测试中心:您无法打开二维数组.我还没有开的二维.光看数据是不可能的. 太大. 有两种方法来提高全省内存DP: 1 所谓卷的阵列 2 反向表 久没做背包DP,突然认为 ...
- poj 3624 Charm Bracelet(区间dp)
题目链接:http://poj.org/problem?id=3624 思路分析: 经典的0-1背包问题: 分析如下: 代码如下: #include <iostream> using na ...
- POJ 3624 Charm Bracelet(01背包裸题)
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38909 Accepted: 16862 ...
- POJ 3624 Charm Bracelet (01背包)
题目链接:http://poj.org/problem?id=3624 Bessie has gone to the mall's jewelry store and spies a charm br ...
- poj 3624 && hdu 2955(背包入门)
http://poj.org/problem?id=3624 背包中最基础的01背包,大意是有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总 ...
- POJ 3624 Charm Bracelet(0-1背包模板)
http://poj.org/problem?id=3624 题意:给出物品的重量和价值,在重量一定的情况下价值尽可能的大. 思路:经典0-1背包.直接套用模板. #include<iostre ...
- poj 3624 Charm Bracelet 背包DP
Charm Bracelet Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=3624 Descripti ...
随机推荐
- poj3176【简单DP】
其实就是简单递推对吧~ 贴一发记忆化搜索的- #include <iostream> #include <stdio.h> #include <string.h> ...
- POJ3468【线段树lazy操作】
上午理论AC,打到现在快吐了... 一个那么**Lazy操作打成这样,query操作和update操作都有问题,妈蛋,发现是mid<=s+1-真是蠢到家,明明是mid+1<=s卧槽连左和右 ...
- Codeforces 378C
DFS连通块,思路就是搜到底,然后一个一个回溯(填上X)上来 #include <iostream> #include <stdio.h> #include <strin ...
- bzoj 1566: [NOI2009]管道取珠【dp】
想不出来想不出来 仔细考虑平方的含义,我们可以把它想成两个人同时操作,最后得到相同序列的情况 然后就比较简单了,设f[t][i][j]为放了t个珠子,A的上方管道到了第i颗珠子,B的上方管道到了第j颗 ...
- 阿里云服务器及部署mysql
可通过百度获取内容不再赘述. 远程连接: 远程连接阿里云服务器需在服务器上开放443端口,方法自行百度 win10通过系统自带远程连接服务连接时需安装凭据: http://blog.csdn.ne ...
- 莫比乌斯函数 && HDU-1695
莫比乌斯函数定义: $$\mu(d)=\begin{cases}1 &\text{d = 1}\\(-1)^r &\text{$d=p_1p_2...p_r,其中p_i为不同的素数$} ...
- CoreData修改了数据模型报错 The model used to open the store is incompatible with the one used to create the store
在iOS 6 – Core Data 应用程序的开发过程中, App启动时出现如下异常信息: reason = “The model used to open the store is incompa ...
- 507 Perfect Number 完美数
对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”.给定一个 正整数 n, 如果他是完美数,返回 True,否则返回 False示例:输入: 28输出: True解释: ...
- 148 Sort List 链表上的归并排序和快速排序
在使用O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 详见:https://leetcode.com/problems/sort-list/description/ Java实 ...
- 获取一段HTML文本中的第一张图片与截取内容摘要
有时候我们获得到的数据是一段HTML文本,也许这段文本里面有许多图片,需要截取一张作为标题图片,这时就可以用到下面这个方法获取到第一张图片: #region 获取第一张图片 /// <summa ...