DP的背包问题可谓是最基础的DP了,分为01背包,完全背包,多重背包

  • 01背包

装与不装是一个问题

01背包基本模型,背包的总体积为v,总共有n件物体,每件物品的体积为v[i],价值为w[i],每件物品只有一个,怎么使背包内尽可能的装更多的物品且价值最大?

模板为一维滚动数组,f[m]表示装m的最大价值和.

可得状态转移方程为

f[j]=max(f[j],f[j-v[i]]+w[i])

也就是f[i]为装,那么总体积数相减然后价值增加,或者不装什么都不变。

例题

https://www.luogu.org/problemnew/show/P1060

可以把总钱数看做体积v,重要度乘以钱数为价值w[i],经过套模板可以直接解答

代码

#include <bits/stdc++.h>
using namespace std;
int f[30010];
int v[30010];
int w[30010];
int main()
{
int m,n,t;
cin>>m>>n;
for(int i=1;i<=n;i++)
cin>>v[i]>>t,w[i]=v[i]*t;
for(int i=1;i<=n;i++)
for(int j=m;j>=v[i];j--)
f[j]=max(f[j],f[j-v[i]]+w[i]);
cout<<f[m];
}

注意的问题就是f必须比总价值开的要大,要不RE,并且两层for内层for是逆序的。

  • 完全背包

装与不不装是一个问题,装多少又是一个问题

完全背包基本模型,背包的总体积为v,总共有n件物体,每件物品的体积为v[i],价值为w[i],每个物品有无限多个,怎么使背包内尽可能的装更多的物品且价值最大?

与01背包不同的是从物品唯一变成了物品有无限多个

模板还是为一维滚动数组,f[m]表示装m的最大价值和.

可得状态转移方程为

f[j]=max(f[j],f[j-v[i]]+w[i])

也就是f[i]为装,那么总体积数相减然后价值增加,或者不装什么都不变。接着去计算装上的最大值。

例题

https://www.luogu.org/problemnew/show/P1616

可以把总时间看做体积v,药品价值看做w[i],因为药品无限,所以套用完全背包模板

代码

#include <bits/stdc++.h>
using namespace std;
int f[100010];
int w[100010];
int v[100010];
int main()
{
int m,n,ans=-1;
cin>>m>>n;
for(int i=1;i<=n;i++)
cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=v[i];j<=m;j++)
f[j]=max(f[j],f[j-v[i]]+w[i]);
cout<<f[m];
}

注意这里是正序的!!!

  • 多重背包

现在装与不装,装多少都不是问题了,问题是装的东西还有数量上限???

多重背包基本模型,背包的总体积为v,总共有n件物体,每件物品的体积为v[i],价值为w[i],每个物品有n[i]个,怎么使背包内尽可能的装更多的物品且价值最大?

多重背包可以分解成01背包

模板就是分解成01背包然后再套01背包的模板

例题

/*庆功会

【问题描述】

为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员。期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力。

【输入格式】

第一行二个数n(n<=500),m(m<=6000),其中n代表希望购买的奖品的种数,m表示拨款金额。 接下来n行,每行3个数,v、w、s,分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和购买的数量(买0件到s件均可),其中v<=100,w<=1000,s<=10。

【输出格式】

第一行:一个数,表示此次购买能获得的最大的价值(注意!不是价格)。

【输入样例】

5 1000

80 20 4

40 50 9

30 50 7

40 30 6

20 20 1

【输出样例】

1040*/

代码

#include <bits/stdc++.h>
using namespace std;
int f[6010],v[6010],w[6010],n[6010],n1;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int vv,ww,nn,t=1;
cin>>vv>>ww>>nn;
while(nn>=t)
{
v[++n1]=t*vv;
w[n1]=t*ww;
nn-=t;
t*=2;
}
v[++n1]=vv*nn;
w[n1]=ww*nn;
}
for(int i=1;i<=n1;i++)
for(int j=m;j>=v[i];j--)
f[j]=max(f[j],f[j-v[i]]+w[i]);
cout<<f[m];
}

注意中间的分组优化

DP背包问题小总结的更多相关文章

  1. hdu 3709 数字dp(小思)

    http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...

  2. HDU 1561 树形DP背包问题

    这是自己第一道背包上树形结构问题,不是很理解这个概念的可以先看看背包九讲 自己第一次做,看了一下别人的思路,结合着对简单背包问题的求解方式自己一次AC了还是有点小激动的 题目大意是: 攻克m个城市,每 ...

  3. DP背包问题学习笔记及系列练习题

    01 背包: 01背包:在M件物品中取出若干件物品放到背包中,每件物品对应的体积v1,v2,v3,....对应的价值为w1,w2,w3,,,,,每件物品最多拿一件. 和很多DP题一样,对于每一个物品, ...

  4. POJ 1417 True Liars(种类并查集+dp背包问题)

    题目大意: 一共有p1+p2个人,分成两组,一组p1,一组p2.给出N个条件,格式如下: x y yes表示x和y分到同一组,即同是好人或者同是坏人. x y no表示x和y分到不同组,一个为好人,一 ...

  5. HDU 3127 WHUgirls dp背包问题

    WHUgirls Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total ...

  6. CodeForces 714E Sonya and Problem Wihtout a Legend(单调数列和DP的小研究)

    题意:给你n个数字,每个数字可以加减任何数字,付出变化差值的代价,求最后整个序列是严格单调递增的最小的代价. 首先我们要将这个题目进行转化,因为严格单调下是无法用下面这个dp的方法的,因此我们转化成非 ...

  7. 【换根DP】小奇的仓库

    题目背景 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 题目内容 喵星系有\(n\)个星球,星球以及星球间的航线形成一棵树. 从星球\(a\) ...

  8. DP 优化小技巧

    收录一些比较冷门的 DP 优化方法. 1. 树上依赖性背包 树上依赖性背包形如在树上选出若干个物品做背包问题,满足这些物品连通.由于 01 背包,多重背包和完全背包均可以在 \(\mathcal{O} ...

  9. 【USACO】DP动态规划小测(一)

    {20160927 19:30~21:30} 总分400分,我113.33,稳稳地垫底了......(十分呼应我上面的博客名,hhh~)过了这么多天我才打完所有代码,废话我也就不多说了.不过,虽然时间 ...

随机推荐

  1. 关于C语言指针的一些新认识(2)

    在使用C语言编程的过程中,遇到了很多关于指针使用的小问题,这里总结一下就当做是编程的小技巧啦 Q1. 如何用printf( )输出指针 这个问题相当于如何用printf( )输出地址,答案是:用"%p ...

  2. ECMAScript 对象类型

    ECMAScript:本地对象.内置对象.宿主对象 一.本地对象: 定义:ECMA-262(ECMAScript语言规范) 定义其为“独立于宿主环境的 ECMAScript 实现提供的对象”.它是由 ...

  3. Codeforces #2B The least round way(DP)

    Description 有一个n*n的正整数矩阵,要你求一条从第一行第一列的格子到第n行第n列的路,使得你走过的格子里面的数乘起来的值末尾的零的个数最小.输出最小个数. Input 第一行包括1个数n ...

  4. Execution Order In a Test Plan

    1.Config Element 2.Pre  Processors 3.Timer 4.Sampler 5.Post Processors 6.Assertions 7.Listener

  5. Android 触摸提示音【转】

    本文转载自:http://blog.csdn.net/Jin_HeZai/article/details/46791567 近期任务,涉及Android触摸提示音. 首先,定位源码目标.很显然的,在原 ...

  6. C语言strdup()函数:复制字符串【转】

    本文转载自:http://c.biancheng.net/cpp/html/166.html 头文件:#include <string.h> 定义函数:char * strdup(cons ...

  7. MySQL 1071错误解决办法

    今天在使用mysql时,又遇到了如博文标题所示的问题,以前针对该问题未进行记录,今天特意进行说明存档.         该问题是由键值字段长度过长导致.mysql支持数据库表单一键值的最大长度不能超过 ...

  8. codevs1036商务旅行(LCA)

    1036 商务旅行  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 某首都城市的商人要经常到各城镇去做 ...

  9. [App Store Connect帮助]三、管理 App 和版本(6.1)转让 App:App 转让概述

    当您将某个 App 出售给其他开发者,或想要将其移至其他 App Store Connect 帐户或组织时,您需要转让该 App. 您无需将 App 从 App Store 下架,即可将其所有权转让给 ...

  10. [Swift通天遁地]二、表格表单-(3)在表格中嵌套另一个表格并使Cell的高度自适应

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...