[Programación dinámica] Mochila completa: hucha (recién llena)

La mochila es exactamente el problema completo:

Hay n artículos cuyos pesos (o espacio ocupado) son w1, W.,... Wn. Los valores son V1, 2....n. ←
Dada una mochila con una capacidad total de W, cada artículo puede solo se puede colocar en la mochila como un todo o no.
P: ¿Cómo elegir los artículos que se ponen en la mochila para que el peso total de los artículos en la mochila sea exactamente W y el valor total sea el más grande o el más pequeño?

El problema de solo llenar la mochila es el mismo que el de la mochila ordinaria 01, pero la inicialización es diferente + finalmente juzgue si se puede llenar

dp[i][j]: el valor máximo de los primeros elementos i que solo se llenan con j

Problema de inicialización:

Simplemente rellene para encontrar el valor mínimo: dp->inf,dp[0]=0

Simplemente complete para encontrar el valor máximo: dp->-inf, dp[0]=0

comprender:

(1) La inicialización se refiere al estado legal en el que no se colocan artículos en la mochila.

① Una mochila con una capacidad de 0 se puede llenar sin nada, y el valor es 0, entonces dp[0]=0

② Una mochila cuya capacidad no es 0 no se puede llenar sin cargar nada, y se encuentra en un estado indefinido, por lo que se le debe asignar infinito

(2) La solución legal actual debe derivarse del estado legal anterior. Si dp[m] sigue siendo inf después de que finaliza el bucle, significa que no hay ningún estado legal que pueda derivarse a m, lo que significa que no puede ser llenado con un número de n números.

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

Supongo que te gusta

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