01背包 完全背包 多重背包 求价值 求方案数 各种模板

菜得只能背模板…QAQ


N为物品数,V为背包体积
v[i],w[i],s[i]分别表示第i件物品的体积、价值、数量

01背包(求最大价值)

每种物品只有一件

模板题:AcWing 01背包问题

f[j]表示体积最大为j的最大价值
答案为f[V]

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

完全背包(求最大价值)

每种物品有无限多件

模板题:AcWing 完全背包问题

答案为f[V]

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

多重背包(求最大价值)

每种物品有若干件

模板题:AcWing 多重背包问题

答案为f[V]

for(int i=1;i<=N;i++)
{
	for(int j=V;j>=v[i];j--)
	{
		for(int k=0;k<=s[i]&&k*v[i]<=j;k++)
		{
			f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
		}
	}
} 

01背包(求方案数)

给了物品体积和价值,求最优选法(最大价值)的方案数

模板题:AcWing 背包问题求方案数

f[j]表示最大体积为j的最大价值
cnt[j]表示最大体积为j的最大价值的方案数

答案为cnt[V]

for(int i=0;i<=V;i++)
  cnt[i]=1;

for(int i=1;i<=N;i++)
{
	for(int j=V;j>=v[i];j--)
	{
		if(f[j]<f[j-v[i]]+w[i])
		{
			f[j]=f[j-v[i]]+w[i];
			cnt[j]=cnt[j-v[i]];
		}
		else if(f[j]==f[j-v[i]]+w[i])
		{
			cnt[j]=cnt[j]+cnt[j-v[i]];
		}
	}
} 

其他变形题

1.给出物品的体积,(每种物品只有一件)求把背包装满最多有几种方案

例题:计蒜客 神器的口袋
计蒜客 数字组合

f[j]表示最大体积为j时的最大方案数
答案为f[V]

f[0]=1;
for(int i=1;i<=N;i++)
	{
		for(int j=V;j>=v[i];j--)
		{
			f[j]=f[j]+f[j-v[i]];
	}
}

2.给出物品的体积,(每种物品无限多件)求把背包装满最多有几种方案

答案为f[V]

f[0]=1;
for(int i=1;i<=N;i++)
	{
		for(int j=v[i];j<=V;j++)
		{
			f[j]=f[j]+f[j-v[i]];
		}
}

3.给出物品的体积,(每种物品只有一个)求背包最多能装多大体积

本质还是求最大价值,其实就是体积和价值等价了

例题:计蒜客 干草出售

答案为f[V]

for(int i=1;i<=N;i++)
{
	for(int j=V;j>=v[i];j--)
	{
		f[j]=max(f[j],f[j-v[i]]+v[i]);
	}
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值