遞推 貪心 金幣

2021-08-24 18:17:11 字數 1391 閱讀 2114

描述:

有n個金幣,每個金幣的面值都是2的冪。現在給出若干個查詢,每次查詢乙個數值最少需要多少個金幣。如果不能由這些金幣組合出,那麼輸出-1。

輸入:

第一行兩個整數n和q,分別表示金幣的數量和查詢的數量。(1<=n,q<=200000)

第二行有n個正整數,表示金幣的面值,這些數保證是2的冪,且不超過2000000000。

接下來有q行,表示q個查詢。每行乙個整數,不超過1000000000。

輸出:

q行,對於每個詢問的回答。

樣例輸入:

542

4824

851410

樣例輸出:

1-1

32

這道題目是一道遞推+貪心的綜合題目,解題思路由下:

1:由於金幣的面值不超過int範圍且都為2的整數冪,所以可以用遞推方式求出各種面值的錢幣,存在陣列1中(注意,包含2的0次方)。

:2:輸入實際存在的錢幣數n,並統計這些錢幣在31種面值的錢幣中存在多少枚,存在陣列2中。

通過以上步驟我們拿到了陣列1(31種錢幣的面值)和陣列2(實際存在的面值的錢幣數量)。

3:既然題目要求最少的組合數,那麼我們可以1-q輸入乙個總數x之後,從最大面值的錢幣開始找(30-0),如果(錢幣存在且面值小於輸入的這個總數x),則進行相應操作。

**如下:

//這道題資料量較大,盡量使用格式化輸入輸出。

#include

#include

using

namespace std;

int n,q,a[

200005

],x,c[35]

=,d[35]

,tot;

intmain()

//求出各種面額的錢幣。

scanf

("%d %d"

,&n,

&q);

for(

int i=

1;i<=n;i++)}

}for

(int i=

1;i<=q;i++

)else

//否則,減去最多錢幣個數*面額。

if(x==0)

//如果分完了,退出迴圈。}}

if(x==0)

//如果分完,輸出最少錢幣數。

else

//分不完,輸出-1。

}return0;

}

小結:這道題其實找到了正確思維,其實不難,在平常做題要足夠仔細,才能萬無一失。(例如本題a[i]的範圍)

NOIP2011 觀光公交 貪心 遞推

傳送門 60 資料 也許能用dp 100 資料 k範圍太大,不能dp 題解 想一想貪心。如果只有乙個加速器,我們肯定選乘坐人數最多的那條路。擴充套件到m個加速器的情況,只需要每次選取乘坐人數最多的路,使用加速器更新答案,就行了。對於乙個站,可以分成兩種情況 車等人,人等車。因此,使用乙個加速器,只會...

遞迴 遞推 貪心 搜尋和動態規劃

遞迴 函式呼叫自身,直到達到基線條件之後,再一層層的回歸到最初的問題。這是一種自頂向下的方法。動態規劃通常是用遞推 自底向上 來實現的,但是使用備忘錄遞迴 自頂向下 也能夠實現動態規劃。例如,動態規劃 從入門到放棄 結合這篇部落格的例子來理解,詳解動態規劃 鄒博講動態規劃 已知問題規模為n的前提a,...

NOIp提高組 2011選擇客棧 貪心 遞推

題解 本題主要考查貪心 遞推。簡要題意 兩個客棧a,b,滿足a,b顏色相同且 a,b 閉區間之間必須存在某個客棧的咖啡店的花費 p。求滿足的方案數。1.貪心 遞推 我們列舉客棧,用t來記錄最近的花費小於等於p的客棧,以它為選擇的咖啡店,向後列舉記錄到上乙個t的客棧顏色種類數 因為 a,b 閉區間有花...