貪心 聖誕老人的禮物

2021-10-01 03:03:55 字數 1667 閱讀 6844

聖誕節來臨了,聖誕老人準備分發糖果,現在有多箱不同的糖果,每箱糖果有自己的價值和重量,每箱糖果都可以拆分成任意散裝組合帶走。聖誕老人的馴鹿雪橇最多只能裝下重量w的糖果。請問聖誕老人最多能帶走多大價值的糖果。

第一行由兩個部分組成,分別為糖果箱數正整 n (1 <= n <= 100) ,馴鹿能承受的最大重量正整數 w (0 < w <10000),兩個數用空格隔開。其餘 n 行每行對應一箱糖果,由兩部分組成,分別為一箱糖的價值正整數 v 和重量正整數 w,中間用空格隔開。

輸出:輸出聖誕老人能帶走的糖果最大總價值,保留 1 位小數 。輸出為一行,以換行符結束。

4 15

100 4

412 8

266 7

591 2

1193.0

當然是拿 價值/重量 比 最大的,通俗一點就是單價最高的嘛!我們可以將每一種糖果封裝成乙個結構體,有價值、重量、 價值/重量比 三個屬性。然後按照價值/重量比從大到小排序。先拿第乙個結構體陣列,如果不夠再拿第二個…這樣就是乙個貪心演算法的思路——從問題的區域性出發,不考慮整體,然後由區域性解構成整體解。排序我們可以採用快排,看**

#include

typedef

struct

candy;

//交換結構體

void

swap

(candy &a,candy &b)

void

quicksort

(candy a,

int left,

int right)

while

(i!=j)

quicksort

(a,left,i-1)

;quicksort

(a,i+

1,right);}

intmain()

quicksort

(a,0

,n-1);

int lw = w;

//剩下重量

double sum =0;

//總價值

int i;

for(i =

0;lw>=a[i]

.weight;i++

) sum+

=a[i]

.price*lw;

printf

("%llf"

,sum)

;_for

(i,0

,n) cout<.price<<

" ";

return

0;}

宣告結構體用到了 typedef struct ,所以結構體名稱可以寫再右大括號後面。

一般來說swap()函式是不用自定義的,因為c++的swap()函式包含於std::標準名詞空間中(交換的是陣列變數或普通變數),但此函式交換的是結構體裡的變數,故要自定義(況且還是c語言)

貪心演算法的主要思想為:每一步行動總是按某種指標選取最優的操作來進行,該指標只看眼前,並不考慮以後可能造成的影響

(貪心演算法需要證明其正確性)

「聖誕老人禮物」題,若糖果只能整箱拿,則貪心法錯誤

考慮下面例子:

3個箱子 (8,6) (5,5) (5,5),雪橇總容量10

按照貪心先拿完第乙個,但剩餘容量就不足了,故不是最優解,此時用 dp(動態規劃)會更好

聖誕老人的禮物

問題描述 聖誕節來臨了,在城市a中聖誕老人準備分發糖果,現在有多箱不同的糖果,每箱糖果有自己的價值和重量,每箱糖果都可以拆分成任意散裝組合帶走。聖誕老人的馴鹿最多只能承受一定重量的糖果,請問聖誕老人最多能帶走多大價值的糖果。輸入 第一行由兩個部分組成,分別為糖果箱數正整數n 1 n 100 馴鹿能承...

1292 聖誕老人

這道題是一道動態規劃題 for int j 0 j 上面是該題的式子。例如 測試資料 315 199 155 301 215 170 150 25 當發射第二顆飛彈時i 2,我們另j 0。首先a j a i 即a 0 a 2 成立。於是我們看一下ans j 1 ans i ans 0 1 ans 2...

UOJ UR 4追擊聖誕老人

傳送門考慮直接維護乙個堆,然後往裡面丟鏈,並且取出k個堆頂就行了。然後就需要分類討論啥的,給你的三個點變成兩條鏈,每次取出一條鏈之後選擇權值最小的再劈成兩條鏈丟進去。卡空間 所以樹剖,不選擇倍增 複雜度o n k logn include include include define mn 5000...