2025/2/5课堂记录
目录
-
Banknotes
- 庆功宴
多重背包题
之前有过一个二进制压缩的方法,当然,直接套3for模板也能过
这次这个就是单调队列压缩的方法,是真的离谱
还是这篇博客,里面的东西是在是讲不清楚,但是看样子就是普通单调队列模板,没搞明白
这个代码是我自己写的
#include<iostream>
using namespace std;
int q[40010],q2[40010],f[40010];//q存下标,q2存值
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int v,w,s;
cin>>w>>v>>s;
s=min(s,m/w);//m是背包容量,w是这种物体一个的重量,即在有多少个和最多能装多少个中取最小值
for(int d=0;d<=w-1;d++)//枚举一个相同余数组的到来
{
int h=1,t=0;
int k=(m-d)/w;///同余于d的状态共有k+1个:d,d+w,d+2w,...,d+kw,k用来表示状态数量
for(int j=0;j<=k;j++)
{
while(h<=t&&f[d+j*w]-j*v>=q2[t])t--;//维护单调递增
q[++t]=j,q2[t]=f[d+j*w]-j*v;
while(q[h]<j-s)h++;//保证区间长度不超过s
f[d+j*w]=max(f[d+j*w],q2[h]+j*v);
}
}
}
cout<<f[m]<<"\n";
return 0;
}
这题简单啊
也很明显吧,单调队列题
自然可以直接套模板
然后这是纯模板3for
#include<iostream>
using namespace std;
int v[555],w[555],s[555],dp[555][6666];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>w[i]>>v[i]>>s[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<=s[i];k++)
if(k*w[i]<=j)
dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+k*v[i]);
cout<<dp[n][m];
return 0;
}
然后还是可以用单调队列优化
优化出来是这样
#include<iostream>
using namespace std;
int q[40010],q2[40010],f[40010];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int v,w,s;
cin>>w>>v>>s;
s=min(s,m/w);
for(int j=0;j<w;j++)
{
int k=(m-j)/w;
int l=1,r=0;
for(int kk=0;kk<=k;kk++)
{
while(l<=r&&f[j+kk*w]-kk*v>=q2[r])r--;
q[++r]=kk,q2[r]=f[j+kk*w]-kk*v;
while(q[l]<kk-s)l++;
f[j+kk*w]=max(f[j+kk*w],q2[l]+kk*v);
}
}
}
cout<<f[m]<<"\n";
return 0;
}
至于二进制压缩,没写,嘿嘿
本文来自博客园,作者:永韶,转载请注明原文链接:https://www.cnblogs.com/yongshao/p/18702252
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 开源的 DeepSeek-R1「GitHub 热点速览」
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)