① 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. C# 编程—字符串(方法应用)、数学Math函数、DateTime、异常捕获、其他

    其他:        #--任意位数字,有几位显示几位        0--至少以为数字,不足则补0        例如:#.00--必须保留两位小数 字符串(string): Length  长度 ...

  2. shell字符串的空值检查

  3. ivew-admin 导入excel

    1.使用上传组件 <Upload ref="upload" name="importData" action="/api/device/impo ...

  4. Win10桌面图标显示不正常变成了白色

    开机不知道什么原因,windows 10 桌面图标全部变成了白色,软件是可以点击正常打开使用,但是看着特别不爽.今天就告诉大家一种办法,解决这种问题. 解决步骤 1.在桌面右键新建 "文本文 ...

  5. Halo(一)

    @EnableJpaAuditing 审计功能(启动类配置) 在实际的业务系统中,往往需要记录表数据的创建时间.创建人.修改时间.修改人. 每次手动记录这些信息比较繁琐,SpringDataJpa 的 ...

  6. Redis端口配置

    redis.host=192.168.200.128redis.port=6379redis.pass=redis.database=0redis.maxIdle=300redis.maxWait=3 ...

  7. springcloud中provider-product依赖

    <dependencies> <dependency> <groupId>cn.lijun.springcloud</groupId> <arti ...

  8. javaweb判断当前请求是否为移动设备访问的方法

    由于移动端和pc端还是稍微有些区别的,我觉得最好是在一个地儿统一判断,而且不要改动原先的代码,这样可以从一定程度上减少bug的数量.我的想法是首先应该判断当前请求是否为移动端,然后设一个标识到sess ...

  9. 每天一个linux命令:touch(9)

    touch touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来:二是用来创建新的空文件 格式 touch [选项] [文件] 参数 ...

  10. 【LeetCode 37】解数独

    题目链接 [题解] 回溯法搞一下. 用set和数组下标判重. [代码] class Solution { public: set<int> myset[9]; int hang[9][10 ...