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