1. 程式人生 > >2.3阿里巴巴與四十大盜 揹包問題

2.3阿里巴巴與四十大盜 揹包問題

有一天,阿里巴巴趕著一頭毛驢上山砍柴。砍好柴準備下山時,遠處突然出現一股煙塵,瀰漫著直向上空飛揚,朝他這兒捲過來,而且越來越近。靠近以後,他才看清原來是一支馬隊,他們共有四十人,一個個年輕力壯、行動敏捷。一個首領模樣的人揹負沉重的鞍袋,從叢林中一直來到那個大石頭跟前,喃喃地說道:“芝麻,開門吧!”隨著那個頭目的喊聲,大石頭前突然出現一道寬闊的門路,於是強盜們魚貫而入。阿里巴巴待在樹上觀察他們,直到他們走得無影無蹤之後,才從樹上下來。他大聲喊道:“芝麻,開門吧!”他的喊聲剛落,洞門立刻打開了。他小心翼翼地走了進去,一下子驚呆了,洞中堆滿了財物,還有多得無法計數的金銀珠寶,有的散堆在地上,有的盛在皮袋中。突然看見這麼多的金銀財富,阿里巴巴深信這肯定是一個強盜們數代經營、掠奪所積累起來的寶窟。為了讓鄉親們開開眼界,見識一下這些寶物,他想一種寶物只拿一個,如果太重就用錘子鑿開,但毛驢的運載能力是有限的,怎麼才能用驢子運走最大價值的財寶分給窮人呢?阿里巴巴陷入沉思中……

注:可以財寶可以打破帶走

解題思路:

先算出價效比,然後對價效比進行排序,可巧妙的利用結構體的知識進行解題。

解題程式碼:

#include <stdio.h>
typedef struct three{
	double w;
	double v;
	double p;
}three;
int main(){
	three t;
	int x=0;double sum=0;
	int MAX=30;
	three arr[10];
	arr[0].w=2;arr[1].w=5;arr[2].w=8;arr[3].w=9;arr[4].w=5;
	arr[5].w=4;arr[6].w=5;arr[7].w=5;arr[8].w=5;arr[9].w=4;
	arr[0].v=8;arr[1].v=15;arr[2].v=20;arr[3].v=18;arr[4].v=8;
	arr[5].v=6;arr[6].v=7;arr[7].v=6;arr[8].v=5;arr[9].v=3;
	for(int i=0;i<10;i++){
		arr[i].p=arr[i].v/arr[i].w;
	}
	for(int i=0;i<10;i++){
		for(int j=i;j<10;j++){
			if(arr[i].p<arr[j].p){
				t=arr[i];
				arr[i]=arr[j];
				arr[j]=t;
			}
		}
	}
	while(MAX>0){
		sum=sum+arr[x].v;
		MAX=MAX-arr[x].w;
		x++;
	}
	MAX=MAX+arr[x-1].w;
	sum=sum-arr[x-1].v;
	printf("%.2lf",MAX*arr[x-1].p+sum);
	return 0;
}