它这个问题问的是,在有限的容量下,能装下的最大价值是多少。

所以我们可以递归求解,记忆性递归,用二维数组,但是这样的话就会超内存,所以我们只能用动规来写,而且不能开二维数组,

只能用滚动数组。

我们设一个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-背包问题的更多相关文章

  1. 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)

    Charm Bracelet    POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...

  2. poj 3624 Charm Bracelet 01背包问题

    题目链接:poj 3624 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放.             用子问题定义状态:即F [i, v]表示前i件物品恰放入一个容量为v 的背包可以 ...

  3. POJ.3624 Charm Bracelet(DP 01背包)

    POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...

  4. POJ 3624 Charm Bracelet 背包问题的解决方案

    最简单的背包问题,标题应该是除了背包测试中心:您无法打开二维数组.我还没有开的二维.光看数据是不可能的. 太大. 有两种方法来提高全省内存DP: 1 所谓卷的阵列 2 反向表 久没做背包DP,突然认为 ...

  5. poj 3624 Charm Bracelet(区间dp)

    题目链接:http://poj.org/problem?id=3624 思路分析: 经典的0-1背包问题: 分析如下: 代码如下: #include <iostream> using na ...

  6. POJ 3624 Charm Bracelet(01背包裸题)

    Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38909   Accepted: 16862 ...

  7. 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 ...

  8. poj 3624 && hdu 2955(背包入门)

    http://poj.org/problem?id=3624 背包中最基础的01背包,大意是有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总 ...

  9. POJ 3624 Charm Bracelet(0-1背包模板)

    http://poj.org/problem?id=3624 题意:给出物品的重量和价值,在重量一定的情况下价值尽可能的大. 思路:经典0-1背包.直接套用模板. #include<iostre ...

  10. poj 3624 Charm Bracelet 背包DP

    Charm Bracelet Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=3624 Descripti ...

随机推荐

  1. 51nod1163【贪心】

    思路: 我们可以说: ①:价值大的不管时间早晚,都可以取,时间较晚的,本身就可以取,那么肯定是大的在前面取,但是在最前面那也是不对的,那么条件就是在规定的时间内,大的就是取了,因为他大,OK. ②:只 ...

  2. hdoj1272【并查集】

    因为是第二遍,所以题目也没怎么看,然后一开始的思路就是如果每次输入两个点的时候判断是不是同一个集合,如果同一个就是No,然后就wa了,想想也是,然后瞄了一下题解,还要判连通-真是蠢死了-多个集合都想不 ...

  3. iptables 使用总结

    Linux 系统的防火墙功能是由内核实现的 2.0 版内核中,包过滤机制是 ipfw,管理工具是 ipfwadm 2.2 版内核中,包过滤机制是 ipchain,管理工具是 ipchains 2.4 ...

  4. AtCoder Regular Contest 074 F - Lotus Leaves

    题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人 ...

  5. 1051:A × B problem 大数相乘

    给你两个整数,请你计算A × B. 输入 数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数.接着有T组数据,每组数据只有一行,包括两个非负整数A和B.但A和B非常大,Redraimen ...

  6. 线段树+离散化 POJ 2528 Mayor's posters

    题目传送门 题意:在一面墙上贴海报,有先后顺序,问最后有多少张不同的海报(指的是没被覆盖或者只是部分覆盖的海报) 分析:这题数据范围很大,直接搞超时+超内存,需要离散化:离散化简单的来说就是只取我们需 ...

  7. 递推DP URAL 1031 Railway Tickets

    题目传送门 /* 简单递推DP:读题烦!在区间内的都更新一遍,dp[]初始化INF 注意:s1与s2大小不一定,坑! 详细解释:http://blog.csdn.net/kk303/article/d ...

  8. 【LeetCode 337 & 329. memorization DFS】House Robber III

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  9. sql server的一个字符串分割的表值函数方法

    ALTER function [dbo].[BOSplit](@SourceSql nvarchar(max),  --要分割的字段@StrSeprate varchar(10)      --分割符 ...

  10. elasticsearch6安装head插件

    1.head 插件Github地址:https://github.com/mobz/elasticsearch-head 2.npm install 3.npm run start 由于head插件监 ...