Expérience 2: algorithme gourmand

Expérience 2: algorithme gourmand

  • J'ai commencé ce soir à expérimenter l'algorithme gourmand, je l'avais contacté pendant les vacances d'été de première année. L'idée de base n'est pas de considérer l'optimum global, mais de résoudre le problème du point de vue de l'optimum local.
  • Passons maintenant aux questions
  • Le problème est de donner la capacité totale du sac à dos, puis de donner le poids et la valeur des articles séparément. Les articles peuvent être divisés en n'importe quelle taille, et la valeur totale des articles dans le sac à dos doit être la plus grande. Trouvez la valeur totale.
  • ** Idées de solutions:
  • Entrée: entrez la capacité du sac à dos m et le nombre d'articles n sur la première ligne, et entrez la capacité et la valeur totale de n sacs à dos dans les n lignes suivantes.
  • Solution: Étape 1: Divisez les nombres dans le tableau r [], j [] pour obtenir le prix unitaire de ces n sacs à dos et mettez-les dans un [], puis selon
  • Pourquoi le résultat de l'exécution de votre propre code et du code de l'enseignant est-il différent? ? ?
  • **! ! ! ** L'exigence de l'expérience est un problème de sac à dos décomposable, mais le code de l'expérience donne le code pour le problème de sac à dos 0-1, et le code écrit par moi-même est également correct. Il semble que le problème du sac à dos 0-1 soit plus difficile.
  • Voici maintenant l'idée du problème du sac à dos décomposable 0-1. Le tri possible est que la capacité connectée et le prix total de cet objet doivent être triés en fonction du prix unitaire de haut en bas, donc le tri par bulle rend le temps complexe haut.
  • step1: Trier selon le prix unitaire de haut en bas, la capacité connectée et le prix total de cet objet
  • étape 2: Dans la boucle while, boucle avec le courant de capacité du sac à dos actuel> = 0 comme condition de restriction. Lorsqu'il est dans la boucle, le bénéfice total est directement ajouté à la valeur de l'objet. Lorsque le cycle n'est pas satisfait, le bénéfice total est ajouté à l'actuel * j [i]. Lorsque tous les objets sont placés dans le sac à dos et toujours pas pleins, cassez-les.
  • code montrer comme ci-dessous:
在这里插入代码片
#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
*/

  • d'accord! ! ! Commencez par expérimenter trois

Je suppose que tu aimes

Origine blog.csdn.net/CSDN_Ysu/article/details/109033544
conseillé
Classement