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