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. LeetCode 171. Excel Sheet Column Number (Excel 表格列数字)

    Related to question Excel Sheet Column Title Given a column title as appear in an Excel sheet, retur ...

  2. Redis主节点内存占用过高

    0. 基本情况 Redis采用集群模式,560个主节点,主从比为1:1,单台机器上为16个节点.info memory观察到主节点A单个Redis内存used_memory_rss_human为9.2 ...

  3. 解决 EF where<T>(func) 查询的一个性能问题

    前两年帮朋友 做了个网吧管理软件,采用动软的三层架构 sql语句生成的.最近因功能变更 要改动,而我这段正在做asp.net mvc +ef+autofac的一个电商网站.索性 就把原来的底层全重新了 ...

  4. 诡异之--map clear 之后可能导致size != 0的操作

    map<char, int>mp; charMp[; charMp['b'] ++; cout<<charMp['a']<<endl; cout<<ch ...

  5. [LeetCode]152. Maximum Product Subarray

    This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...

  6. 【转】Linux下使用locale命令设置语言环境

    转自:http://www.cnblogs.com/dolphi/p/3622570.html locale命令设置语言环境 在Linux中通过locale来设置程序运行的不同语言环境,locale由 ...

  7. 开始玩qt,使用代码修改设计模式生成的菜单

    之前制作菜单时,不是纯代码便是用设计模式 直接图形化完成. 今天我就是想用代码修改已经存在的菜单项,如果是用代码生成的可以直接调用指针完成: 但通过设计模式完成的没有暴露指针给我,至少我没发现. 在几 ...

  8. reactnative(2) - Navigator 使用案例

    'use strict'; import React, { Component } from 'react'; import { AppRegistry, ScrollView, StyleSheet ...

  9. [ POI 2011 ] Dynamite

    \(\\\) \(Description\) 一棵\(N\)个节点的树,树上有\(M\)个节点是关键点,选出\(K\)个特殊点,使得所有关键点到特殊点的距离中最大的最小,输出最大值最小为多少. \(N ...

  10. HDU3949 XOR(线性基第k小)

    Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base num ...