#include #include #define n 5 // nombre d'objets const int poids []={7,4,5,8,6}, utilite[]={9,5,5,6,4}, capacite=15, // poids total maximal quand on maximise l'utilité besoin=10; // utilité totale minimale quand on minimise le poids typedef struct {int optrelax, realisable, objetpartiel; enum {obligatoire, interdit, pris, nonpris} etat[n];} noeud; void evaluemaxutil(noeud *a) { int i, po=a->realisable=0; a->objetpartiel=-1; for(i=0;ietat[i]==obligatoire) po+=poids[i], a->realisable+=utilite[i]; if(po>capacite) { a->optrelax=a->realisable-1; return; } for(i=0;ietat[i]>interdit) { if(po+poids[i]<=capacite) po+=poids[i], a->realisable+=utilite[i], a->etat[i]=pris; else { a->etat[i]=nonpris; if(a->objetpartiel<0) a->optrelax=a->realisable+(capacite-po)*utilite[i]/poids[i], a->objetpartiel=i; } } if (a->objetpartiel<0) a->optrelax=a->realisable; } void evalueminpoids(noeud *a) { int i, ut=a->realisable=0; for(i=0;ietat[i]==obligatoire) a->realisable+=poids[i], ut+=utilite[i]; a->optrelax=a->realisable; for(i=0;ietat[i]<=interdit) ; else if(ut>=besoin) a->etat[i]=nonpris; else if(a->etat[i]=pris, a->realisable+=poids[i], ut+=utilite[i], ut>=besoin) a->optrelax=a->realisable-(ut-besoin)*poids[i]/utilite[i], a->objetpartiel=i; if(utoptrelax=a->realisable+1; a->optrelax*=-1; // pour transformer la minimisation en maximisation a->realisable*=-1; } void aff(noeud a) { if(a.optrelax=%d %d ",a.optrelax,a.realisable,a.objetpartiel); for(i=0;ioptrelax>=a->realisable && a->realisable>meilleur.realisable) meilleur=*a; } void separe(noeud a) { noeud b=a; // aff(a); printf("%3d ",meilleur.realisable); getchar(); if(a.optrelaxb.optrelax) separe(a), separe(b); else separe(b), separe(a); } int i; for(i=0;iutilite[i-1]*poids[i]) printf("%d/%d<%d/%d\n",utilite[i-1],poids[i-1],utilite[i],poids[i]), exit(1); resout(evalueminpoids); resout(evaluemaxutil ); return 0; }