2025/2/5课堂记录

目录

  1. Banknotes

  2. 庆功宴

多重背包题

之前有过一个二进制压缩的方法,当然,直接套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;	
}

至于二进制压缩,没写,嘿嘿

 

posted @   永韶  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 开源的 DeepSeek-R1「GitHub 热点速览」
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
点击右上角即可分享
微信分享提示