Solía ser "¡ Ven, ayúdame a ver esta pregunta ! "
Es " Sí, ¡hay una respuesta en línea! "
Mientras pienses, puedes convertirte en algo en tu cerebro. Entonces, ¿ pensaste ?
Directorio
Problema de mochila de tema simple
Problema de mochila de tema simple
Descripción del título
Hay una mochila que puede poner el peso del artículo S, los n artículos existentes, el peso es w1, w2, w3, ... wn.
Pregunte si puede elegir varios de estos n artículos para poner en su mochila, de modo que la suma de los pesos sea exactamente S.
Si hay una opción que cumple con las condiciones, la mochila tiene una solución, de lo contrario el problema de la mochila no tiene solución.
De entrada
Hay varias líneas de datos de entrada, incluido el peso del elemento colocado es s, el número de elementos n y el peso de cada elemento (los datos de entrada son todos enteros positivos)
Múltiples conjuntos de datos de prueba.
Salida
Para cada instancia de prueba, si se cumple la condición, salida "SÍ", si no se cumple, salida "NO"
Entrada de muestra
20 5
1 3 5 7 9
Salida de muestra
YES
Resolución de problemas
Utilizando la idea de la programación dinámica, el peso [1 ... n] se utiliza para representar el peso de cada objeto. Después de seleccionar varios objetos, el peso [m] del objeto se agrega para cumplir con el peso total de s, luego s-weight [ m] es igual a la suma de los pesos de los objetos seleccionados previamente. Cuando se repite esta operación, s se convierte en s-weight [m], el número de objetos se reduce en 1 sobre la base original, y un objeto seleccionado es peso peso [ n]. Por lo tanto, podemos usar la recursividad para determinar si se cumplen las condiciones:
if(packet(s - weight[n - 1], n - 1)){
return true;
}
else return packet(s,n - 1);
Por supuesto, encontrará un objeto delante del peso [m] que no es la fila seleccionada, así que omita este objeto y haga un juicio.
Código completo
#include<iostream>
using namespace std;
int weight[1000];
bool packet(int s,int n){
if(s == 0) return true;
if(s < 0 ||(s > 0 && n < 1)){
return false;
}
if(packet(s - weight[n - 1], n - 1)){
return true;
}
else return packet(s,n - 1);
}
int main(){
int s, n;
while(cin>>s>>n){
for(int i = 0; i < n; i++){
cin>>weight[i];
}
if(packet(s,n))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
Temas relacionados
Anterior: Algoritmo-Cambio de moneda (número mínimo de monedas)
Si no comprende algunos algoritmos, es normal. Debería jugar con su teléfono por un tiempo y concentrarse en comprender durante decenas de minutos (¡sí! ¡Decenas de minutos! Por supuesto, es para comenzar a usar Xiaobai). Además, dirás "¡Es tan simple!" ——Lynn