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