byteotian bit bank (bbb) 擁有一套先進的貨幣系統,這個系統一共有n種面值的硬幣,面值分別為b1, b2,..., bn. 但是每種硬幣有數量限制,現在我們想要湊出面值k求最少要用多少個硬幣.
第一行乙個數 n, 1 <= n <= 200.
接下來一行 n 個整數b1, b2,..., bn, 1 <= b1 < b2 < ... < b n <= 20 000,
第三行 n 個整數c1, c2,..., cn, 1 <= ci <= 20 000, 表示每種硬幣的個數.
最後一行乙個數k – 表示要湊的面值數量, 1 <= k <= 20 000.
第一行乙個數表示最少需要付的硬幣數
典型的多重揹包,用f[i][j]表示在前i種硬幣下,要湊到j元最少需多少個硬幣。動態轉移方程為:f[i][j]=min(f[i-1][j-v[i]]+1,f[i-1][j])。
但是,這道題有可能有多個硬幣,所以可能會超時,所以用到一種神奇的優化,二進位制優化。比如可以用1,2,4,8,5(20-1-2-4-8=5)這5個數進行組合並相加,來得到20以內的任何數。比如說用n個一元,就能把它們合併成面值為1,2,4...等log2n+1個等效硬幣,原來n個01的選擇變成了log2n+1個,大大降低了時間複雜度。
1 #include2 #include3 #include4int b[4000],w[4000],v[4000],f[4000100];5
using
namespace
std;
6int
main()7
23 num++;
24 w[num]=c-(t-1
);25 v[num]=b[i]*w[num];26}
27int
k;28 cin>>k;
29for (int i=1; i<=k; i++)
30 f[i]=2100000000
;31 f[0]=0;32
for (int i=1; i<=num; i++)
33for (int j=k; j>=v[i]; j--)
34 f[j]=min(f[j-v[i]]+w[i],f[j]);
35 cout36return0;
37 }
poi知識積累
匯出需要的頭 response.setcontenttype octets stream charset utf 8 需要匯出的 型別都是可以在tomcat conf下的web.xml中找到 response.setheader content disposition attachment file...
POI通過getDateCellValue讀取日期
寫這篇文章的由來 1.遇到了這個問題 2.通過搜尋沒有合適的解決方案 3.筆者發現了問題的根源,下面進入正題 近期在使用poi解析excel日期單元格時出現了乙個問題,通過getdatecellvalue獲取到的時間不對 都是1900年的日期,可筆者已經將日期單元格格式設定為日期格式,為什麼讀取時間...
POI常用設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 獲取工作簿 hssfworkbook hwb newhssfworkbook 獲取sheet hssfsheet sheet hwb.createsheet 獲採樣式物件 hssfcellstyle cellstyle h...