【动态规划】完全背包:存钱罐(恰好装满)

背包恰好装满问题:

设有n个物品,其重量(或占用空间)分别为w1, W.,...Wn.价值分别为V1,2....n. ←
给定一个总容量为W的背包,每个物品只能整个放入背包或不放。←
问:如何选择放入背包的物品,使得背包中的物品的总重恰好为W的同时,总价值最大/小?

背包恰好装满问题和普通01背包相同,只是初始化不同+最后判断是否能装满

dp[i][j]:前i个物品恰好装满j的最值

初始化问题:

恰好装满求最小值:dp->inf,dp[0]=0

恰好装满求最大值:dp->-inf,dp[0]=0

理解:

(1)初始化是指在没有任何物品放入背包的合法状态。

①容量为0的背包可以在什么也不装的情况下恰好被装满,价值为0,所以dp[0]=0

②容量不为0的背包在什么也不装的情况下不可能被装满,属于未定义的状态,所以应该被赋无穷

(2)当前的合法解,一定是之前的合法状态推导得到,如果循环结束后,dp[m]还是inf,说明没有合法的状态能够推导到m,说明不能从n个数中选若干个装满m

代码:

void input()
{
	cin>>e>>f;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i]>>w[i];
	}
}
int main()
{
	input();
	memset(dp,inf,sizeof(dp));
	dp[0]=0;
	int v=f-e;
	for(int i=1;i<=n;i++)
	{
		for(int j=w[i];j<=v;j++)
		{
			dp[j]=min(dp[j],dp[j-w[i]]+p[i]);
		}
	}
	if(dp[v]==inf)
	{
		cout<<"impossible"<<endl;
	}
	else
	{
		cout<<dp[v]<<endl;
	}
  
}

猜你喜欢

转载自blog.csdn.net/m0_52043808/article/details/124001135
今日推荐