果然一遇到背包的这种问题,我就有一点束手无策hh 传送门 :
思路题目给我们一下几个量 : L ( 区 间 长 度 ) , N ( 输 入 组 数 ) , B ( 最 大 费 用 ) L(区间长度),N(输入组数),B(最大费用) L(区间长度),N(输入组数),B(最大费用)
题目要求 : 需要在满足装满体积的情况下,不超过最大费用 的最大价值
显然对于这种题,我们一般都是小区间 d p dp dp到大区间
所以状态表示 : f [ i ] [ j ] f[i][j] f[i][j]表示能覆盖[0~i]的区间,且费用不超过j的最大价值
因此状态转移按照 01 01 01背包来推算的话,应该是
f [ i . x + i . b ] [ j ] = m a x ( f [ i . x + i . b ] [ k ] , f [ i . x ] [ k − i . v ] + i . w ) f[i.x + i.b][j] =max( f[i.x+i.b][k],f[i.x][k-i.v]+i.w ) f[i.x+i.b][j]=max(f[i.x+i.b][k],f[i.x][k−i.v]+i.w)
- 如果不选这个点那么 就从 f [ i . x + i . b ] [ k ] f[i.x+i.b][k] f[i.x+i.b][k]转移过来
- 否则选这个点,那么上一个点转移过来 f [ i . x ] [ k − i . v ] + i . w f[i.x][k-i.v]+i.w f[i.x][k−i.v]+i.w
当然这个是在 [0~i]之间有通路的情况下才可以转移
为了方便 d p dp dp 我们需要按照起点排序一下
CODEstruct node
{
int a,b,v,w;
}num[N];
int f[M][M];
int l,m,n,ans;
bool cmp(node x,node y)
{
return x.a >l>>n>>m;
for(int i=1;i>num[i].a>>num[i].b>>num[i].w>>num[i].v;
//起点 长度 价值 费用
sort(num+1,num+1+n,cmp);
for(int i=1;i=num[i].v;k--)//枚举费用
{
if(num[i].a !=0 && f[num[i].a][k-num[i].v]==0)
continue;
//只有在 起点不为0
f[num[i].a+num[i].b][k] = max(
f[num[i].a+num[i].b][k],
f[num[i].a][k-num[i].v]+num[i].w
);
}
}
for(int i=1;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?