Algoritmo simple problema de mochila

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

Descripción del título

De entrada

Salida

Entrada de muestra

Salida de muestra

Resolución de problemas

Código completo

 Temas relacionados


 

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

 Enlace del título


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

19 artículos originales publicados · elogiados 239 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_45703420/article/details/105452823
Recomendado
Clasificación