锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 姝﹂挗涓変腑 鍚磋豹 銆愬紩璦銆? 鍦ㄨВ棰樿繃紼嬩腑錛屾垜浠湁鏃墮渶瑕佺淮鎶や竴涓暟緇勭殑鍓嶇紑鍜孲[i]=A[1]+A[2]+...+A[i]銆? 浣嗘槸涓嶉毦鍙戠幇錛屽鏋滄垜浠慨鏀逛簡浠繪剰涓涓狝[i],S[i]銆丼[i+1]...S[n]閮戒細鍙戠敓鍙樺寲銆? 鍙互璇達紝姣忔淇敼A[i]鍚庯紝璋冩暣鍓嶇紑鍜孲[]鍦ㄦ渶鍧忔儏鍐典笅浼氶渶瑕丱(n)鐨勬椂闂淬? 褰搉闈炲父澶ф椂錛岀▼搴忎細榪愯寰楅潪甯哥紦鎱€? 鍥犳錛岃繖閲屾垜浠紩鍏モ滄爲鐘舵暟緇勨濓紝瀹冪殑淇敼涓庢眰鍜岄兘鏄疧(logn)鐨勶紝鏁堢巼闈炲父楂樸? 銆愮悊璁恒? 涓轟簡瀵規爲鐘舵暟緇勬湁涓艦 璞$殑璁よ瘑錛屾垜浠厛鐪嬩笅闈㈣繖寮犲浘銆? 濡傚浘鎵紺猴紝綰㈣壊鐭╁艦琛ㄧず鐨勬暟緇凜[]灝辨槸鏍戠姸鏁扮粍銆? 榪欓噷錛孋[i]琛ㄧずA[i-2^k+1]鍒癆[i]鐨勫拰錛岃宬鍒欐槸i鍦ㄤ簩榪涘埗鏃舵湯灝?鐨勪釜鏁幫紝 鎴栬呰鏄痠鐢?鐨勫箓鏂瑰拰琛ㄧず鏃剁殑鏈灝忔寚鏁般? 錛?褰撶劧錛屽埄鐢ㄤ綅榪愮畻錛屾垜浠彲浠ョ洿鎺ヨ綆楀嚭2^k=i&(i^(i-1)) 錛? 鍚屾椂錛屾垜浠篃涓嶉毦鍙戠幇錛岃繖涓猭灝辨槸璇ヨ妭鐐瑰湪鏍戜腑鐨勯珮搴︼紝鍥犺岃繖涓爲鐨勯珮搴︿笉浼氳秴榪噇ogn銆? 鎵浠?褰撴垜浠慨鏀笰[i]鐨勫兼椂錛屽彲浠ヤ粠C[i]寰鏍硅妭鐐逛竴璺笂婧紝璋冩暣榪欐潯璺笂鐨勬墍鏈塁[]鍗沖彲錛? 榪欎釜鎿嶄綔鐨勫鏉傚害鍦ㄦ渶鍧忔儏鍐典笅灝辨槸鏍戠殑楂樺害鍗砄(logn)銆?nbsp; 鍙﹀錛屽浜庢眰鏁板垪鐨勫墠n欏瑰拰錛屽彧闇鎵懼埌n浠ュ墠鐨勬墍鏈夋渶澶у瓙鏍戯紝鎶婂叾鏍硅妭鐐圭殑C鍔犺搗鏉ュ嵆鍙? 涓嶉毦鍙戠幇錛岃繖浜涘瓙鏍戠殑鏁扮洰鏄痭鍦ㄤ簩榪涘埗鏃?鐨勪釜鏁幫紝鎴栬呰鏄妸n灞曞紑鎴?鐨勫箓鏂瑰拰鏃剁殑欏規暟, 鍥犳錛屾眰鍜屾搷浣滅殑澶嶆潅搴︿篃鏄疧(logn)銆? 鎺ョ潃錛屾垜浠冨療榪欎袱縐嶆搷浣滀笅鏍囧彉鍖栫殑瑙勫緥錛? 棣栧厛鐪嬩慨鏀規搷浣滐細 宸茬煡涓嬫爣i錛屾眰鍏剁埗鑺傜偣鐨勪笅鏍囥?br> 鎴戜滑鍙互鑰冭檻瀵規爲浠庨昏緫涓婅漿鍖栵細 鏈夊浘鍙煡錛屽浜庤妭鐐筰錛屽叾鐖惰妭鐐圭殑涓嬫爣涓庣炕鎶樺嚭鐨勭┖鐧借妭鐐逛笅鏍囩浉鍚屻? 鍥犺岀埗鑺傜偣涓嬫爣 p=i+2^k (2^k鏄痠鐢?鐨勫箓鏂瑰拰灞曞紑寮忎腑鐨勬渶灝忓箓錛屽嵆i涓烘牴鑺傜偣瀛愭爲鐨勮妯? 鍗?p = i + i&(i^(i-1)) 銆? 鎺ョ潃瀵逛簬姹傚拰鎿嶄綔錛? 鍥犱負姣忔5瀛愭爲瑕嗙洊鐨勮寖鍥撮兘鏄?鐨勫箓錛屾墍浠ユ垜浠姹傚瓙鏍慽鐨勫墠涓媯墊爲錛屽彧闇璁﹊鍑忓幓2鐨勬渶灝忓箓鍗沖彲銆? 鍗?p = i - i&(i^(i-1)) 銆? 鑷蟲錛屾垜浠凡緇忔瘮杈冭緇嗙殑鍒嗘瀽浜嗘爲鐘舵暟緇勭殑澶嶆潅搴﹀拰鍘熺悊銆? 鍦ㄦ渶鍚庯紝鎴戜滑灝嗙粰鍑轟竴浜涙爲鐘舵暟緇勭殑瀹炵幇浠g爜錛屽笇鏈涜鑰呰兘澶熶粩緇嗕綋浼氬叾涓殑緇嗚妭銆? 銆愪唬鐮併? 姹傛渶灝忓箓2^k: int Lowbit(int t) 姹傚墠n欏瑰拰錛? int Sum(int end) 瀵規煇涓厓绱犺繘琛屽姞娉曟搷浣滐細 void plus(int pos , int num)
]]>
濡傚浘錛屾垜浠皢瀛愭爲鍚戝彸瀵圭О緲繪姌錛岃櫄鎷熷嚭涓浜涚┖鐧界粨鐐癸紙鍥句腑鐧借壊錛夛紝灝嗗師鏍戣漿鍖栨垚瀹屽叏浜屽弶鏍戙?
{
return t & ( t ^ ( t - 1 ) );
}
{
int sum = 0;
while(end > 0)
{
sum += in[end];
end -= Lowbit(end);
}
return sum;
}
{
while(pos <= n)
{
in[pos] += num;
pos += Lowbit(pos);
}
}
瀛︿範瑕佹眰錛氱啛緇冭繍鐢ㄨ椽蹇冪畻娉曡В鍐充互涓嬮棶棰?br> 1.鑳屽寘闂
2.媧誨姩浼氬満瀹夋帓闂
3.鏈灝忎唬浠風敓鎴愭爲
4.鍝堝紬鏇肩紪鐮?br> 5.鍗曟簮鏈鐭礬寰?br>
璇句歡涓嬭澆錛?a href="http://www.shnenglu.com/Files/Geek/Greedy.rar">http://www.shnenglu.com/Files/Geek/Greedy.rar
]]>
瀛︿範瑕佹眰錛氱啛緇冭繍鐢ㄥ垎娌葷畻娉曟濇兂瑙e喅浠ヤ笅闂
1.浜屽弶鏌ユ壘綆楁硶
2.鏌ユ壘鏈澶ф渶灝忓?
3.褰掑茍鎺掑簭
4.蹇熸帓搴?/span>
5.閫夋嫨絎琸灝忓厓绱?/span>
6.澶ф暣鏁頒箻娉?/span>
鍒嗘不綆楁硶綆浠?/span>
鍒嗘不綆楁硶涔熷彨鍒嗘不絳栫暐錛屾妸杈撳叆鍒嗕負鑻ュ共涓儴鍒嗭紝閫掑綊鐨勮В姣忎竴涓棶棰橈紝鏈鍚庡皢榪欎簺瀛愰棶棰樺悎騫舵垚涓轟竴涓叏灞瑙c傚鏋滃瓙闂杈冨ぇ錛屽彲浠ュ啀嬈′嬌鐢ㄥ垎娌葷瓥鐣ャ?/span>
鐢辨鍙互寰楀埌鍒嗘不絳栫暐瑙e喅鐨勯棶棰樼壒鐐癸細
1.璇ラ棶棰樼殑瑙勬ā緙╁皬鍒頒竴瀹氱殑紼嬪害灝卞彲浠ュ鏄撳湴瑙e喅錛?/span>
2.璇ラ棶棰樺彲浠ュ垎瑙d負鑻ュ共涓妯¤緝灝忕殑鐩稿悓闂;
3.鍒嗚В鍑虹殑瀛愰棶棰樼殑瑙e彲浠ュ悎騫朵負鍘熼棶棰樼殑瑙o紱
4.鍒嗚В鍑虹殑鍚勪釜瀛愰棶棰樻槸鐩鎬簰鐙珛鐨勩?/span>
澶у宸茬粡鐪嬪埌鍒掑垎鍑虹殑鑷棶棰樹笌鍘熼棶棰樻槸涓鏍風殑錛岄偅涔堟垜浠璁$畻娉曠殑鏃跺欎篃灝卞彲浠ュ埄鐢ㄩ掑綊鐨勭紪紼嬫妧宸т簡錛?/span>
涓嶆兂鎵撳瓧浜嗭紝鐩存帴鎶奝PT涓婁紶浜?/span>http://www.shnenglu.com/Files/Geek/Divd.rar 錛圥PT涓寘鍚互涓婂悇涓棶棰樼殑鍒嗘瀽寰堢畻娉曠殑浠g爜錛?br>
]]>
緇欏畾n縐嶇墿鍝佸拰涓鑳屽寘錛岀墿鍝乮鐨勯噸閲忔槸wi錛屽叾浠峰間負vi錛岃儗鍖呯殑瀹歸噺涓篊銆傞棶搴斿浣曢夋嫨瑁呭叆鑳屽寘鐨勭墿鍝侊紙鐗╁搧涓嶈兘鍒嗗壊錛夛紝浣垮緱瑁呭叆鑳屽寘涓墿鍝佺殑鎬諱環鍊兼渶澶?
鎶借薄鎻忚堪濡備笅錛?/span>
x[n]:琛ㄧず鐗╁搧鐨勯夋嫨錛寈[i]=1琛ㄧず閫夋嫨鏀捐繘鐗╁搧i鍒拌儗鍖呬腑銆?/span>
闂鍒嗘瀽錛?/span>
1.鎶借薄涔嬪悗鑳屽寘闂杞崲涓烘壘鍒頒竴涓渶浼樼殑鏁扮粍錛寈1錛寈2錛?....,xn鐨?-1搴忓垪銆?/span>
2.鍋囪鏈浼樿В鐨勫簭鍒椾負x1錛寈2錛?....,xn錛岃兘浣胯儗鍖呭閲廋鐨勬諱環鍊兼渶澶?
濡傛灉錛寈1=1錛屽垯x2,...,xn鏄疌-w1瀹歸噺鐨勮儗鍖呯殑鎬諱環鍊?span style="color: red;">渚濈劧鏄?/span>鏈澶х殑搴忓垪錛?/span>
濡傛灉錛寈1=0錛屽垯x2,....,xn鏄疌瀹歸噺鐨勮儗鍖呯殑鎬諱環鍊?span style="color: red;">渚濈劧鏄?/span>鏈澶х殑搴忓垪銆?/span>
榪欏氨鏄垜浠墍璇寸殑鏈浼樺瓙緇撴瀯鎬ц川銆?/span>
3.榪涗竴姝ュ垎鏋愶細鎴戜滑鐢╩(i,j)琛ㄧず涓哄凡緇忓垽鏂ソ浜唅:n鐨勫簭鍒楃殑鑳屽寘鏈澶т環鍊鹼紝騫朵笖姝ゆ椂鐨勮儗鍖呭墿浣欑殑瀹歸噺涓簀錛屽鐗╁搧i榪涜鍒ゆ柇
濡傛灉j>wi, 灝卞彧瑕佸仛鍑洪夋嫨wi鍜屼笉閫夋嫨wi鎯呭喌涓嬶紝鍝鏇磋兘浣胯儗鍖呯殑鎬諱環鍊兼洿澶э細m(i,j)=max{ m(i+1,j),m(i+1,j-wi)+vi}(娉ㄦ剰榪欐槸涓掑綊寮?
濡傛灉j<wi: m(i,j)=m(i+1,j)
鍒濆鍖栵細 m(n,j)=vn (j>= wn)錛?/span>
m(n,j)=0 (0<=j< wn)
m(0,C)=0
鏈緇堢殑緇撴灉錛歮(1,C)
4.渚濇鎴戜滑灝卞緱鍒頒簡涓涓掑綊鐨勮〃杈懼紡錛?/span>
5.濡傛灉鍗曠函鐨勪粠鍒╃敤閫掑綊錛岄噸澶嶈綆椾簡寰堝鐨勫鹼紝鑰楄垂鐨勬椂闂存槸寰堝ぇ鐨勶紝鍔ㄦ佽鍒掕繕闇閬垮厤榪欑閲嶅璁$畻錛屾庢牱鑷《鍚戜笅鎴栬嚜搴曞悜涓婄殑璁$畻鍛紵
閲囩敤鍒楄〃鐨勬柟娉曞氨鍙互寰堝ソ鐨勫垎鏋愯璁¤嚜欏跺悜涓嬫垨鑷簳鍚戜笂鐨勮綆楃殑綆楁硶浜?
涓句緥鍒嗘瀽錛?/span>
n=3,c=6,w={4,3,2} v={5,2,1}
m[i][j]=max{ m[i+1][j], m[i+1][j-w[i]]+v[i] }
鍒楄〃濡備笅錛?/span>
鏈宸﹁竟綆ご錛氭垜浠綆楃殑鏂瑰悜錛屼粠絎?琛屽紑濮嬪悜涓婅綆楁硶鍊箋?/span>
琛ㄤ腑綰㈣壊綆ご鏄垜浠氳繃閫夋嫨鍋氬嚭鐨勭粨鏋滐細鍒楀 m[2][3]=max{m[3][3],m[3][3-w[2]]+v[2]}錛屾垜浠渶緇堥夋嫨浜唌[3][3-w[2]]+v[2]銆?/span>
鏁翠釜闂鐨勬渶浼樿В淇濆瓨鍦╩[1][6]涓?/span>
浠g爜瀹炵幇錛?/span>
//v[]:淇濆瓨鐗╁搧浠峰?br>//n:鐗╁搧鏁扮洰 c:鑳屽寘瀹歸噺
//#define max(a,b) (((a) > (b)) ? (a) : (b))
int KnapsackDP(int n,int c)
{
int i,j;
//鍒濆鍖?/span>
for (j=0;j<=c;j++)
{
if (j>=w[n])
m[n][j]=v[n];
else
m[n][j]=0;
}
for (i=n-1;i>=0;i--)
{
for (j=0;j<=c;j++)
{
if (j>=w[i])
m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
else
m[i][j]=m[i+1][j];
}
}
return m[1][c];
}
//鏋勯犻夋嫨搴忓垪x[],x[i]=1琛ㄧず閫夋嫨i鍙風墿鍝佹斁鍒拌儗鍖呬腑錛屽垯x[i]=0琛ㄧず涓嶉夋嫨
void Creatx(int x[])
{
for (i=1;i<n;i++)
{
if (m[i][c]==m[i+1][c])
{
x[i]=0;
}
else
{
x[i]=1;
c-=w[i];
}
}
x[n]=m[n][c]?1:0;//m[n][C]==0鍒欒〃紺轟負娌℃湁閫夋嫨絎琻鍙風墿鍝?
}
瀹炴垬錛?/span>
HDOJ 2602 http://acm.hdu.edu.cn/showproblem.php?pid=2602
]]>
瀛︿範瑕佹眰錛?/span> 1.鐔熺粌榪愮敤C/C++璇█榪涜緙栧啓紼嬪簭.
2.鐔熺粌浣跨敤鍦ㄧ嚎璇勬祴緋葷粺鐜(浠DOJ涓轟緥)銆?br> 3.鎺屾彙OJ璇曢鐨勫父瑙佽緭鍏ュ拰杈撳嚭鏍煎紡銆?br> 4.鎺屾彙綆鍗曠殑璋冭瘯鎶宸э紙浠C++ 6.0涓轟緥錛夈?br>
瀛︿範鍐呭錛?/span>1.娉ㄥ唽HDOJ璐﹀彿錛屾祻瑙堥欏?F.A.Q 鍜?Forum錛屼簡瑙J鍩烘湰瑕佹眰涓庢敞鎰忎簨欏癸紝瀛︿細鍦ㄨ鍧涢噷璁ㄨ瀛︿範銆?br>
2.瀹屾垚HDOJ浠ヤ笅璇曢錛?1000 1089 1090 1091 1092 1093 1094 1095 1096
3.浣跨敤C/C++ 緙栧啓浠ヤ笅綆楁硶騫跺疄鐜般?br> 1.姹傛渶澶у叕綰︽暟鍜屾渶灝忓叕鍊嶆暟銆傦紙嬈у嚑閲屽緱綆楁硶錛?nbsp;