關鍵: 要使m最小,(m,b)中的數不能用(n,a)中的數表示出來
對於 3 19 10 6
19=10+3+3+3
6=3+3
只有3 和 10 不能被(n,a)中的數表示
所以m=2
只需要計算出存在多少個能被其它數組成的數計算出來就行了。
法一:完全揹包
乙個數只能被比它小的數字組成而不能被比它大的數字組成。
可以首先對陣列排序,然後對於每乙個數考慮能不能被它前面的數字所組成。
若x能夠被前i個數組成,那麼x-a[i]也能被前i個數組成
f[x]表示x能否被組成
則f [ x ] = f [ x ] | f [ x - a [ i ] ]
1 #include2using
namespace
std;
3const
int maxn=25000; 4
intmain()5
26for(int j=a[i];j<=a[n];j++)
27 f[j]= (f[j]) | (f[j-a[i]]);28}
29 cout
31return0;
32 }
洛谷P5020貨幣系統
這個題打眼看上去可能是乙個數論或者dp,其實我們可以簡化一下題意,即 給定乙個集合 alpha 找到幾個數使得這幾個數可以拼湊起來這個集合裡所有的數,且需要使這些數的個數最小。這樣這個題就不難理解了,首先看到資料範圍,發現暴搜可以騙不少分,但其實這個題暴搜是可以a的,主要就是可以如何使暴搜的速度加快...
洛谷 P5020 貨幣系統(DP)
題意 略。題記 看題目樣例可以看出乙個規律,新貨幣是舊貨幣的子集。意思就是在原貨幣系統中可以找到一些小面額的貨幣去表示乙個大面額的貨幣。證明略 不會證明 dp i 表示面額為i能否用貨幣表示出來,則f i f i f j 時間複雜度 o 2500010020 include include incl...
洛谷P5020 貨幣系統 完全揹包
題目大意 給定 n 個數,求在這 n 個數中至少選出幾個數能表示出所有數字,輸出最少的個數。題解 由於只有小的數字可以表示大的數字,因此首先需要對這 n 個數字進行從小到大排序。排序之後就變成一道不定個數的數字組合問題,即 完全揹包思想。遍歷每乙個數字,若該數字不能由之前的數字表示出來,則將答案加一...