描述:
有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 閉區間有花...