算法竞赛模板 动态规划之背包DP
① 01背包
有n件物品和一个容量为v的背包。第i件物品的价值是c[i],体积是w[i]。求解将哪些物品装入背包可使价值总和最大。
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,n,v,i,j,w[],c[],dp[];
cin>>t;
while(t--)
{
memset(dp,,sizeof dp);
cin>>n>>v;
for(i=;i<=n;i++)
scanf("%d",&c[i]);
for(i=;i<=n;i++)
scanf("%d",&w[i]);
for(i=;i<=n;i++)
for(j=v;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+c[i]); cout<<dp[v]<<endl;
}
return ;
}
② 完全背包
有n种物品和一个容量为v的背包,每种物品都有无限件。第i种物品的价值是c[i],体积是w[i]。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,n,v,i,j,w[],c[],dp[];
cin>>t;
while(t--)
{
memset(dp,,sizeof dp);
cin>>n>>v;
for(i=;i<=n;i++)
scanf("%d",&c[i]);
for(i=;i<=n;i++)
scanf("%d",&w[i]); for(i=;i<=n;i++)
for(j=w[i];j<=v;j++)
dp[j]=max(dp[j],dp[j-w[i]]+c[i]); cout<<dp[v]<<endl;
}
return ;
}
③ 多重背包
(1) 有n种物品和一个容量为v的背包。第i种物品最多有num[i]件,每件价值是c[i],体积是w[i]。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,v,n,i,j,k,dp[],num[],c[],w[];
cin>>t;
while(t--)
{
memset(dp,,sizeof dp);
cin>>n>>v;
for(i=;i<=n;i++)
scanf("%d%d%d",&c[i],&w[i],&num[i]); for(i=;i<=n;i++)
for(j=;j<=num[i];j++)
for(k=v;k>=w[i];k--)
dp[k]=max(dp[k],dp[k-w[i]]+c[i]); cout<<dp[v]<<endl;
}
return ;
}
(2) 2个人平分n种物品,第i种物品最多有num[i]件,每件物品价值为c[i],保证两者拥有物品的价值差距最小。
ps:物品总价值÷2,再去做多重背包。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define MAX 100005
using namespace std;
int dp[MAX],c[MAX],num[MAX];
int main()
{
int i,j,k,n,v,vhalf;
while(scanf("%d",&n)!=EOF)
{
memset(dp,,sizeof(dp));
v=;
for(i=;i<=n;i++)
{
scanf("%d%d",&c[i],&num[i]);
v+=c[i]*num[i]; //所有物品的总价值
}
vhalf=v/;
for(i=;i<=n;i++)
for(j=;j<=num[i];j++)
for(k=vhalf;k>=c[i];k--)
dp[k]=max(dp[k],dp[k-c[i]]+c[i]); cout<<v-dp[vhalf]<<" "<<dp[vhalf]<<endl;
}
return ;
}
④ 多重背包二进制优化
有n种船只,每种船只的载货量为w[i],每种船只的数量为2^c[i]-1。接下来有q次询问,每次问有多少种载货方式可以填满容量s,结果取模。
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e4;
const int mod=1e9+;
typedef long long ll;
int w[],c[];
ll dp[MAX+];
int main()
{
int n,i,T,q,s,j,k;
ios::sync_with_stdio(false);
cin>>T;
while(T--)
{
cin>>n>>q;
for(i=;i<=n;i++)
cin>>w[i]>>c[i];
memset(dp,,sizeof(dp));
dp[]=;
for(i=;i<=n;i++) //共n种船
{
int t=;
for(j=;j<=c[i];j++)//每种船有2^c[i]-1只
{
for(k=MAX;k>=t*w[i];k--)
dp[k]=(dp[k]+dp[k-t*w[i]])%mod;
t<<=;
}
}
while(q--)
{
cin>>s;
cout<<dp[s]<<endl;
}
}
return ;
}
算法竞赛模板 动态规划之背包DP的更多相关文章
- [luogu1156]垃圾陷阱_动态规划_背包dp
垃圾陷阱 luogu-1156 题目大意:Holsteins在距离地面D英尺的地方,FJ间隔时间ti会往下扔第i个垃圾.Holsteins对待每一个垃圾都会选择吃掉或者垫高.Holsteins有10个 ...
- [bzoj1708][Usaco2007 Oct]Money奶牛的硬币_动态规划_背包dp
Money奶牛的硬币 bzoj-1708 Usaco-2007 Oct 题目大意:在创立了她们自己的政权之后,奶牛们决定推广新的货币系统.在强烈的叛逆心理的驱使下,她们准备使用奇怪的面值.在传统的货币 ...
- 算法竞赛进阶指南 0x52 背包
背包问题是线性背包中的一类重要问题. 0/1背包 模型: 给定N个物品,每一个物品具有两种属性,一个是体积 \(v_i\) ,另一个是容积 \(w_i\) . 有一个容积为M的背包,求一种方案,使得选 ...
- 算法竞赛进阶指南0x51 线性DP
AcWing271. 杨老师的照相排列 思路 这是一个计数的题目,如果乱考虑,肯定会毫无头绪,所以我们从1号到最后一个依次进行安排. 经过反复实验,发现两个规律 每一行的同学必须是从左向右依次连续放置 ...
- [bzoj1606][Usaco2008 Dec]Hay For Sale 购买干草_动态规划_背包dp
Hay For Sale 购买干草 bzoj-1606 Usaco-2008 Dec 题目大意:约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单 ...
- [bzoj2748][HAOI2012]音量调节_动态规划_背包dp
音量调节 bzoj-2748 HAOI-2012 题目大意:有一个初值,给你n个$\delta$值,求最后不超过给定的限制的情况下的改变的最大值.每个$\delta$值可以+也可以-. 注释:$1\l ...
- 算法竞赛模板 AC自动机
AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...
- 算法竞赛模板 KMP
KMP算法图解: ① 首先,字符串“BBC ABCDAB ABCDABCDABDE”的第一个字符与搜索词“ABCDABD”的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. ② 因为B与A ...
- 模板 - 动态规划 - 概率期望dp
https://blog.csdn.net/myjs999/article/details/81022546
随机推荐
- NoWarningNoError(第八组)----Krad项目报告
Alpha阶段展示及总结 Github地址:https://github.com/NiceKingWei/krad 项目地址:119.29.32.204/krad.html 一.项目概况 本组的项目为 ...
- Vue-cli使用prerender-spa-plugin插件预渲染和配置cdn
参考:https://www.jianshu.com/p/6a4c0b281e7f 使用vue-cli打包项目一般为spa项目,众所周知单页面应用不利于SEO,有ssr和预渲染两种解决方案,这里我们只 ...
- Bootstrap 网页实例
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <met ...
- 1、Fiddler 打断点 bpu
一.fiddler 设置断点,可修改以下请求 可以修改HTTP请求头信息,如修改cookie,user-agent等 可以修改请求数据,突破表单限制,提交任意数字,如充值最大金额100,可修改为100 ...
- Shell及其操作环境
来源: 鸟哥的Linux私房菜第十章.認識與學習BASH Shell是什么?1分钟理解Shell的概念! ssh在本地调用远程主机上的命令,不登录远程主机shell 一.Shell Shell 是一个 ...
- Edge Computer:Vision and Challenges
Abstract 随着物联网(Internet of Things)的蓬勃发展和云服务(cloud services)的成功,出现一种新的计算模式:edge computer.用于边缘网络数据的处理, ...
- linux基础(六)
今天我们来看一下Samba服务和nginx服务. Samba服务 1.samba的功能 samba是一个网络服务器,用于Linux和Windows之间共享文件. 2.samba服务的启动.停止.重启 ...
- QT blockingmaster例子学习
dialog.h: #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include "masterthread.h&q ...
- location优先级
location优先级 location优先级 location /img # 直接匹配 location /img { index index.html } location = /img # 精确 ...
- TDengine陶建辉 自带聚光灯&BGM的半百少年
TDengine,这款定位为“专为物联网而生的大数据平台”,引爆了2019年夏天的软件圈. 2019年7月12日,涛思数据宣布将TDengine的内核(存储和计算引擎)以及社区版100%开源. 201 ...