POI2005Bank notes銀行貨幣

2022-08-11 07:39:12 字數 1175 閱讀 5945

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 #include4

int 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...