关于本题二进制优化做法
查看原帖
关于本题二进制优化做法
519986
Luxe877楼主2024/12/4 20:49

rt,为什么有人的二进制优化可以过,但是我的会TLE #36 #51,这个做法是否可行?

如果可行,求卡常。

code:

#include<bits/stdc++.h>
using namespace std;
int S,n;
long long v,w,k;
long long nv[10000002],nw[10000002],gp;
long long dp[10000002];
long long read()
{
	char c=getchar();
	long long num=0;
	int fs=1;
	while(!isdigit(c))
	{
		if(c=='-')
		{
			fs*=-1;
		}
		c=getchar();
	}
	while(isdigit(c))
	{
		num=num*10+(c-'0');
		c=getchar();
	}
	return num*1ll*fs;
}
void out(long long x)
{
	if(x<0)
	{
		x*=-1;
		putchar('-');
	}
	if(x>=10)
	{
		out(x/10);
	}
	putchar('0'+(x%10));
}
int main()
{
	S=read(),n=read();
	gp=0;
	long long j;
	for(register int i=1;i<=n;i++)
	{
		v=read(),w=read(),k=read();
		j=1;
		while(j<=k)
		{
			nv[++gp]=j*v,nw[gp]=j*w;
			k-=j;
			j<<=1;
		}
		if(k)
		{
			nv[++gp]=k*v;
			nw[gp]=k*w;
		}
	}
	for(register int i=1;i<=gp;i++)
	{
		for(register int j=S;j>=nw[i];j--)
		{
			dp[j]=max(dp[j],dp[j-nw[i]]+nv[i]);
		}
	}
	out(dp[S]);
	return 0;
}

2024/12/4 20:49
加载中...