① 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的更多相关文章

  1. [luogu1156]垃圾陷阱_动态规划_背包dp

    垃圾陷阱 luogu-1156 题目大意:Holsteins在距离地面D英尺的地方,FJ间隔时间ti会往下扔第i个垃圾.Holsteins对待每一个垃圾都会选择吃掉或者垫高.Holsteins有10个 ...

  2. [bzoj1708][Usaco2007 Oct]Money奶牛的硬币_动态规划_背包dp

    Money奶牛的硬币 bzoj-1708 Usaco-2007 Oct 题目大意:在创立了她们自己的政权之后,奶牛们决定推广新的货币系统.在强烈的叛逆心理的驱使下,她们准备使用奇怪的面值.在传统的货币 ...

  3. 算法竞赛进阶指南 0x52 背包

    背包问题是线性背包中的一类重要问题. 0/1背包 模型: 给定N个物品,每一个物品具有两种属性,一个是体积 \(v_i\) ,另一个是容积 \(w_i\) . 有一个容积为M的背包,求一种方案,使得选 ...

  4. 算法竞赛进阶指南0x51 线性DP

    AcWing271. 杨老师的照相排列 思路 这是一个计数的题目,如果乱考虑,肯定会毫无头绪,所以我们从1号到最后一个依次进行安排. 经过反复实验,发现两个规律 每一行的同学必须是从左向右依次连续放置 ...

  5. [bzoj1606][Usaco2008 Dec]Hay For Sale 购买干草_动态规划_背包dp

    Hay For Sale 购买干草 bzoj-1606 Usaco-2008 Dec 题目大意:约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单 ...

  6. [bzoj2748][HAOI2012]音量调节_动态规划_背包dp

    音量调节 bzoj-2748 HAOI-2012 题目大意:有一个初值,给你n个$\delta$值,求最后不超过给定的限制的情况下的改变的最大值.每个$\delta$值可以+也可以-. 注释:$1\l ...

  7. 算法竞赛模板 AC自动机

    AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...

  8. 算法竞赛模板 KMP

    KMP算法图解: ① 首先,字符串“BBC ABCDAB ABCDABCDABDE”的第一个字符与搜索词“ABCDABD”的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. ② 因为B与A ...

  9. 模板 - 动态规划 - 概率期望dp

    https://blog.csdn.net/myjs999/article/details/81022546

随机推荐

  1. android pull 解析器解析xml文档

    person.xml <?xml version="1.0" encoding="UTF-8"?> <persons> <pers ...

  2. 关于清除浮动的n中方式

    我们在对页面进行布局的时候经常会用到浮动布局,浮动布局能够很好的实现我们想要的布局效果,同时兼容方面也是很好的,但是当我们在用左右浮动进行页面布局的时候,由于元素浮动脱了了文档流导致浮动元素的父级高度 ...

  3. js返回顶部小Demo

    <style> .divH { height: 1800px; } .divT { width: 50px; height: 50px; font-size: 18px; backgrou ...

  4. 面试题。线程pingpong的输出问题

    第一种情况:public class Main { public static void main(String args[]) { Thread t = new Thread() { public ...

  5. 2018-8-10-git-push-错误-hook-declined-

    title author date CreateTime categories git push 错误 hook declined lindexi 2018-08-10 19:16:52 +0800 ...

  6. wxDateTime用法和转换成wxString

    转载别人的.void datetest() { wxDateTime now=wxDateTime::Now(); wxString date1=now.Format(); wxString date ...

  7. STM8硬件设计注意事项

    1.中断 STM8的外部中断和STM32不一样,每个端口PX只有1个中断 2.ADC 1)Additional AIN12 analog input is not selectable in ADC ...

  8. 拓展练习:Linux权限管理--基础权限/ 特殊权限

    目录 基础权限拓展练习 特殊权限拓展练习 基础权限拓展练习 1.用户基础权限为9位,每三位为一组,每组代表着谁的权限? 前三位代表属主权限位 中间三位代表属组权限位 后三位代表其他用户权限位 2.权限 ...

  9. VS2013+phread.h环境配置

    原文链接:http://blog.csdn.net/qianchenglenger/article/details/16907821 本人使用的是windows7 旗舰版64位 目前用的是pthrea ...

  10. python连接mongodb集群

    一 安装模块pymongo pip3 install pymongo 二 创建一个MongoClient conn=MongoClient('mongodb://cbi:pass@ip1:20000, ...