Experimento 2: algoritmo codicioso

Experimento 2: algoritmo codicioso

  • Comencé a experimentar con el algoritmo codicioso esta noche. Lo había contactado durante las vacaciones de verano de los estudiantes de primer año. La idea básica no es considerar el óptimo general, sino resolver el problema desde la perspectiva del óptimo local.
  • Ahora hagamos las preguntas
  • El problema es dar la capacidad total de la mochila y luego dar el peso y el valor de los artículos por separado. Los artículos se pueden dividir en cualquier tamaño y el valor total de los artículos en la mochila debe ser el mayor. Encuentra el valor total.
  • ** Ideas de solución:
  • Entrada: Ingrese la capacidad de la mochila my el número de artículos n en la primera línea, e ingrese la capacidad y el valor total de n mochilas en las siguientes n líneas.
  • Solución: Paso 1: Divida los números en la matriz r [], j [] para obtener el precio unitario de estas n mochilas y colóquelas en un [], y luego de acuerdo con
  • ¿Por qué el resultado de ejecución de su propio código y el código del profesor es diferente? ? ?
  • **! ! ! ** El requisito del experimento es un problema de mochila descomponible, pero el código del experimento proporciona el código para el problema de mochila 0-1, y el código escrito por mí también es correcto. Parece que el problema de la mochila 0-1 es más complicado.
  • Ahora aquí está la idea del problema de la mochila descomponible 0-1. La clasificación posible se debe a que la capacidad conectada y el precio total de este objeto deben clasificarse de acuerdo con el precio unitario de mayor a menor, por lo que la clasificación de burbujas hace que el tiempo sea complejo alto.
  • paso 1: Ordene según el precio unitario de mayor a menor, la capacidad conectada y el precio total de este objeto
  • paso 2: En el ciclo while, haz un ciclo con la capacidad de la mochila actual current> = 0 como condición de restricción. Cuando está en el ciclo, el beneficio total se suma directamente al valor del objeto. Cuando el ciclo no se satisface, el beneficio total se suma al actual * j [i]. Cuando todos los objetos estén metidos en la mochila y aún no estén llenos, rompe.
  • el código se muestra a continuación:
在这里插入代码片
#include <stdio.h>//可分解的背包问题 
int main(){
    
    
	double r[1000],j[1000],a[1000];
	int n;
	double m,t,Q=0;
	scanf("%d%lf",&n,&m);
	for(int i=0;i<n;i++)
	scanf("%lf%lf",r+i,j+i);
	for(int i=0;i<n;i++)
	a[i]=j[i]/r[i];
	for(int i=0;i<n-1;i++){
    
    
		for(int k=0;k<n-i-1;k++){
    
    
			if(a[k]<a[k+1]){
    
    
				t=a[k];a[k]=a[k+1];a[k+1]=t;
				t=r[k];r[k]=r[k+1];r[k+1]=t;
				t=j[k];j[k]=j[k+1];j[k+1]=t;
			}
			//printf("%lf    %lf    %lf   \n",a[k],r[k],j[k]); 
		}
	}	
	double current=m;
//	for(int i=0;i<n;i++)
//	printf("%.2lf    %.2lf    %.2lf   \n",a[i],r[i],j[i]);

	int i=0,b=0;
	while(current-r[i]>=0){
    
    
		current=current-r[i];
		Q+=j[i];//printf("%.2lf\t",Q);
		if(i==n-1){
    
    
			b=1;
			break;
		}
		i++;
	}
	if(b==0)
	Q+=current*a[i];
	printf("%.2lf\n",Q);
}
/*测试样例 
7 150
35 10
30 40
60 30
50 50
40 35
10 40
25 30
结果为190.63
*/

  • ¡OK! ! ! Experimente tres primero

Supongo que te gusta

Origin blog.csdn.net/CSDN_Ysu/article/details/109033544
Recomendado
Clasificación