关于二进制优化的位置
查看原帖
关于二进制优化的位置
159959
虫洞吞噬者楼主2021/9/21 19:14

RT,我第一遍写的时候是离线操作,结果过不了样例。后来改成离线操作就AC了,附上代码,求大佬查错。

离线操作:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,cnt;
int cos[100100],val[100100],num[100100];
int f[50010000];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)scanf("%d%d%d",&val[i],&cos[i],&num[i]);
	cnt=n;
	for(register int i=1;i<=n;++i)
	{
		int bas=1;
		--num[i];
		while(num[i])
		{
			bas*=2;
			if(num[i]>=bas)
			{
				num[i]-=bas;
				val[++cnt]=val[i]*bas;
				cos[cnt]=cos[i]*bas;
			}
			else
			{
				val[++cnt]=val[i]*num[i];
				cos[cnt]=val[i]*num[i];
				num[i]=0;
			}
		}		
	}
	for(int i=1;i<=cnt;++i)
		for(register int j=m;j>=cos[i];--j)f[j]=max(f[j],f[j-cos[i]]+val[i]);
	printf("%d",f[m]);
	return 0;
}

在线操作:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,cnt;
int cos[100100],val[100100];
int f[50010000];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		int bas=1;
		cos[++cnt]=b*bas;
		val[cnt]=a*bas;
		--c;
		while(c)
		{
			bas*=2;
			++cnt;
			if(c>=bas)
			{
				c-=bas;
				val[cnt]=a*bas;
				cos[cnt]=b*bas;
			}
			else
			{
				val[cnt]=a*c;
				cos[cnt]=b*c;
				c=0;
			}
		}		
	}
	for(int i=1;i<=cnt;++i)
		for(register int j=m;j>=cos[i];--j)f[j]=max(f[j],f[j-cos[i]]+val[i]);
	printf("%d",f[m]);
	return 0;
}

(这两种写法难道不是等价的吗!!??)

2021/9/21 19:14
加载中...