codevs 3269 混合背包
背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少?
第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限
1个数Ans表示所装物品价值的最大值
2 10
3 7 2
2 4 -1
22
对于100%的数据,V <= 200000 , N <= 200
题解:01+多重+完全背包。多重背包必须加二分制优化。不然全部超时。
二分制优化:将第i件物品分为若干件物品,其中每件物品都有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数,是这些系数分别为1,2,4,...2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。而这些数字可以组合成1~n[i]内的所有数字。
例如12,可将其分为1,2,4,5.
#include<cstdio>
#include<iostream>
#define N 210
#define V 200100
using namespace std;
int n,v;
int vi[N],wi[N],mi[N],f[V]={};
int main()
{
scanf("%d%d",&n,&v);
for (int i=;i<=n;i++) scanf("%d%d%d",&vi[i],&wi[i],&mi[i]);
for (int i=;i<=n;i++)
{
if (mi[i]==-)//完全背包
for (int j=vi[i];j<=v;j++) f[j]=max(f[j],f[j-vi[i]]+wi[i]);
else
{
for (int k=;k<=mi[i];k++)//01和多重背包
for (int j=v;j>=vi[i];j--)
f[j]=max(f[j],f[j-vi[i]]+wi[i]);
} }
cout<<f[v]<<endl;
return ;
}
未加二分制的超时代码
#include<cstdio>
#include<iostream>
#define N 210
#define V 200100
using namespace std;
int n,v;
int vi[N],wi[N],mi[N],f[V]={};
int main()
{
scanf("%d%d",&n,&v);
for (int i=;i<=n;i++) scanf("%d%d%d",&vi[i],&wi[i],&mi[i]);
for (int i=;i<=n;i++)
{
if (mi[i]==-)
for (int j=vi[i];j<=v;j++) f[j]=max(f[j],f[j-vi[i]]+wi[i]);
else
{
int x=mi[i];
for (int k=;k<=x;k<<=)//二分制优化 {
for (int j=v;j>=vi[i]*k;j--)
f[j]=max(f[j],f[j-vi[i]*k]+wi[i]*k);
x-=k;
}
if (x)
for (int j=v;j>=vi[i]*x;j--)
f[j]=max(f[j],f[j-vi[i]*x]+wi[i]*x);
}
}
cout<<f[v]<<endl;
return ;
}
加了二分制后的满分代码
codevs 3269 混合背包的更多相关文章
- Codevs 3269 混合背包(二进制优化)
3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为V ...
- codevs 3269 混合背包(复习混合背包)
传送门 [题目大意]给出物品的数量.-1为无限个. [思路]混合背包.... [code] #include<iostream> #include<cstdio> #inclu ...
- CODE[VS] 3269 混合背包
3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 背包体积为V ,给出N ...
- codevs3269 混合背包 x
3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为 ...
- HDU 3535 AreYouBusy (混合背包)
题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...
- HDU 3535 分组混合背包
http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...
- HDU 3535 AreYouBusy(混合背包)
HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...
- HDU3535 AreYouBusy 混合背包
题目大意 给出几组物品的体积和价值,每组分为三种:0.组内物品至少选一个:1.组内物品最多选一个:2.组内物品任意选.给出背包容量,求所能得到的最大价值. 注意 仔细审题,把样例好好看完了再答题,否则 ...
- [codevs3269]混合背包
题目大意:一道混合背包模板. 解题思路:分三种情况讨论,01和完全没什么问题,多重背包需要把物品分成$\log W[i]$件,然后01即可,分成W[i]件01会TLE. 读优大法好! C++ Code ...
随机推荐
- 理解Java NIO
基础概念• 缓冲区操作缓冲区及操作是所有I/O的基础,进程执行I/O操作,归结起来就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么把缓冲区填满(读).如下图• 内核空间.用户空间 上图 ...
- session与cookie的关系
客户第一次发送请求给服务器,此时服务器产生一个唯一的sessionID,并返回给客户端(通过cookie),此时的cookie并没有setMaxAge();只是保存于客户端的内存中,并与一个浏览器窗口 ...
- ubuntu firefox 选中变成了删除
在ubuntu下 我的firefox浏览器出现了问题.描述: 1.在firefox中所有能够删除的文字只要选中就自动删除了. 终端中 ibus-setup勾掉在应用窗口中启用内嵌编辑模式
- mongo 多条件 查询
var query1 = Query<BaseManagerForCompanyModel>.EQ(q => q.sGuidBaseCompany, sGuidBaseCompany ...
- CodeForces 55D Beautiful numbers(数位dp)
数位dp,三个状态,dp[i][j][k],i状态表示位数,j状态表示各个位上数的最小公倍数,k状态表示余数 其中j共有48种状态,最大的是2520,所以状态k最多有2520个状态. #include ...
- Codeforces 544E Remembering Strings 状压dp
题目链接 题意: 给定n个长度均为m的字符串 以下n行给出字符串 以下n*m的矩阵表示把相应的字母改动成其它字母的花费. 问: 对于一个字符串,若它是easy to remembering 当 它存在 ...
- mysql在高内存、IO利用率上的几个优化点 (sync+fsync) 猎豹移动技术博客
http://dev.cmcm.com/archives/107 Posted on 2014年10月16日 by liuding | 7条评论 以下优化都是基于CentOS系统下的一些优化整理,有不 ...
- 原生js方法document.getElementsByClassName在ie8及其以下的兼容性问题
document.getElementsByClassName在ie8及其以下浏览器的兼容性问题,在ie8及其以下浏览器中不能使用,针对这个问题,下面给出详细的解决方法,感兴趣的朋友可以参考下 ...
- MSSQLSERVER服务不能启动
自从用上mysql,好久没打开sqlserver了,今天本想打开调试下MFC连接sqlserver,然后意外发现不能登录,之后我以为是sql服务没启动,然后去启动,还是没用,并且MSSQLSERVER ...
- 学习CSS一些事(上)
p.s:这是我在学习中总结出来知识,如有不对,请多包涵.谢谢. CSS样式:行内样式,内部样式,外部样式,他们的优先级是:行内,内部,外部,遵循就近原则. 一.HTML+CSS布局分为三大类,一是流式 ...