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