[Programação dinâmica] Mochila completa: cofrinho (apenas cheio)

A mochila está exatamente cheia de problema:

Existem n itens cujos pesos (ou espaço ocupado) são w1, W.,...Wn. Os valores são V1, 2....n. ←
Dada uma mochila com capacidade total de W, cada item pode só ser colocado na mochila como um todo ou não.
P: Como escolher os itens colocados na mochila para que o peso total dos itens na mochila seja exatamente W , e o valor total seja o maior/menor?

O problema de apenas encher a mochila é o mesmo da mochila 01 comum, mas a inicialização é diferente + finalmente julgue se ela pode ser preenchida

dp[i][j]: o valor máximo dos primeiros i itens que são preenchidos com j

Problema de inicialização:

Basta preencher para encontrar o valor mínimo: dp->inf,dp[0]=0

Basta preencher para encontrar o valor máximo: dp->-inf, dp[0]=0

Compreendo:

(1) Inicialização refere-se ao estado legal em que nenhum item é colocado na mochila.

① Uma mochila com capacidade 0 pode ser preenchida com nada, e o valor é 0, então dp[0]=0

② Uma mochila cuja capacidade não é 0 não pode ser preenchida sem carregar nada e está em um estado indefinido, portanto, deve ser atribuída infinita

(2) A solução legal atual deve ser derivada do estado legal anterior. Se dp[m] ainda estiver inf após o término do loop, isso significa que não há estado legal que possa ser derivado de m, o que significa que ele não pode ser preenchido com um número de n números. m

Código:

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;
	}
  
}

Acho que você gosta

Origin blog.csdn.net/m0_52043808/article/details/124001135
Recomendado
Clasificación