模板 - 動態規劃

Jerrycyx發表於2024-10-02

揹包

01 揹包

for(int i=1;i<=n;i++)
	for(int j=m;j>=v[i];j--)
	{
		f[j]=max(f[j],f[j-v[i]]+w[i]);
		ans=max(ans,f[j]);
	}

完全揹包

for(int i=1;i<=n;i++)
	for(int j=v[i];j<=m;j++)
	{
		f[j]=max(f[j],f[j-v[i]]+w[i]);
		ans=max(ans,f[j]);
	}

多重揹包

for(int i=1;i<=nt;i++)
{
	int vt,wt,st; scanf("%d%d%d",&vt,&wt,&st);
	int k=0;
	while(k<=st)
	{
		v[++n]=vt<<k;
		w[n]=wt<<k;
		st-=1<<k;
		k++;
	}
	if(st)
	{
		v[++n]=vt+st;
		w[n]=wt*st;
	}
}
for(int i=1;i<=n;i++)
	for(int j=m;j>=v[i];j--)
	{
		f[j]=max(f[j],f[j-v[i]]+w[i]);
		ans=max(ans,f[j]);
	}

分組揹包

for(int i=1;i<=n;i++)
	for(int j=m;j>=0;j--)
		for(int k=1;k<=s[i];k++)
			if(j>=v]i)[k] f[j]=max(f[j],f[j-v[i][k]]+w[i]);

相關文章