锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鑳屽寘涔?1鑳屽寘銆佸畬鍏ㄨ儗鍖呫佸閲嶈儗鍖呰瑙?/p>
PS錛氬ぇ瀹惰寰楀啓寰楄繕榪囧緱鍘伙紝灝卞府鎴戞妸鍗氬欏朵竴涓嬶紝璋㈣阿銆?/span> 棣栧厛璇翠笅鍔ㄦ佽鍒掞紝鍔ㄦ佽鍒掕繖涓滆タ灝卞拰閫掑綊涓鏍鳳紝鍙兘鎵懼眬閮ㄥ叧緋伙紝鑻ユ兂鍏ㄩ儴鍒楀嚭鏉ワ紝鏄緢闅劇殑錛屾瘮濡傛眽璇哄銆備綘鍙互璇村厛鎶婇櫎鏈鍚庝竴灞傜殑鍏朵粬鎵鏈夊眰閮界Щ鍔ㄥ埌2錛屽啀鎶婃渶鍚庝竴灞傜Щ鍔ㄥ埌3錛屾渶鍚庡啀鎶婂叾浣欑殑浠?縐誨姩鍒?錛岃繖鏄竴涓洿瑙傜殑鍏崇郴錛屼絾鏄兂鍒椾婦鍑烘潵鏄緢闅劇殑錛屼篃璁稿綋灞傛暟n=3鏃惰繕鍙互妯℃嫙涓嬶紝鍐嶅ぇ涓浜涘氨涓嶅彲鑳戒簡錛屾墍浠ワ紝璇稿閫掑綊錛屽姩鎬佽鍒掍箣綾葷殑錛屼笉鑳界粏鎯籌紝鍙兘鎵懼眬閮ㄥ叧緋匯?/p>
1.姹夎濉斿浘鐗?/p>
錛堝紩鑷蟲澀鐢佃浠?DP鏈鍏抽敭鐨勫氨鏄姸鎬侊紝鍦―P鏃剁敤鍒扮殑鏁扮粍鏃訛紝涔熷氨鏄瓨鍌ㄧ殑姣忎釜鐘舵佺殑鏈浼樺鹼紝涔熷氨鏄蹇嗗寲鎼滅儲錛?/p>
瑕佷簡瑙h儗鍖咃紝棣栧厛寰楁竻妤氬姩鎬佽鍒掞細 鍔ㄦ佽鍒掔畻娉曞彲鍒嗚В鎴愪粠鍏堝埌鍚庣殑4涓楠わ細 1. 鎻忚堪涓涓渶浼樿В鐨勭粨鏋勶紱 2. 閫掑綊鍦板畾涔夋渶浼樿В鐨勫鹼紱 3. 浠?#8220;鑷簳鍚戜笂”鐨勬柟寮忚綆楁渶浼樿В鐨勫鹼紱 4. 浠庡凡璁$畻鐨勪俊鎭腑鏋勫緩鍑烘渶浼樿В鐨勮礬寰勩?/p>
鍏朵腑姝ラ1~3鏄姩鎬佽鍒掓眰瑙i棶棰樼殑鍩虹銆傚鏋滈鐩彧瑕佹眰鏈浼樿В鐨勫鹼紝鍒欐楠?鍙互鐪佺暐銆?/p>
鑳屽寘鐨勫熀鏈ā鍨嬪氨鏄粰浣犱竴涓閲忎負V鐨勮儗鍖?/span> 鍦ㄤ竴瀹氱殑闄愬埗鏉′歡涓嬫斁榪涙渶澶?鏈灝?)浠峰肩殑涓滆タ 褰撳墠鐘舵?#8594; 浠ュ墠鐘舵?/span> 鐪嬩簡dd澶х墰鐨?span style="COLOR: rgb(0,0,255)">銆婅儗鍖呬節璁層?/a>(鐐瑰嚮涓嬭澆) (www.wutianqi.com鐣欒█鍗沖彲) 棣栧厛鎴戜滑鎶婁笁縐嶆儏鍐墊斁鍦ㄤ竴璧鋒潵鐪嬶細 01鑳屽寘錛圸eroOnePack錛?/a>: 鏈塏浠剁墿鍝佸拰涓涓閲忎負V鐨勮儗鍖呫傦紙姣忕鐗╁搧鍧囧彧鏈変竴浠?/span>錛夌i浠剁墿鍝佺殑璐圭敤鏄痗[i]錛屼環鍊兼槸w[i]銆傛眰瑙e皢鍝簺鐗╁搧瑁呭叆鑳屽寘鍙嬌浠峰兼誨拰鏈澶с?/p>
瀹屽叏鑳屽寘(CompletePack): 鏈塏縐嶇墿鍝佸拰涓涓閲忎負V鐨勮儗鍖咃紝姣忕鐗╁搧閮芥湁鏃犻檺浠跺彲鐢?/span>銆傜i縐嶇墿鍝佺殑璐圭敤鏄痗[i]錛屼環鍊兼槸w[i]銆傛眰瑙e皢鍝簺鐗╁搧瑁呭叆鑳屽寘鍙嬌榪欎簺鐗╁搧鐨勮垂鐢ㄦ誨拰涓嶈秴榪囪儗鍖呭閲忥紝涓斾環鍊兼誨拰鏈澶с?/p>
澶氶噸鑳屽寘(MultiplePack): 鏈塏縐嶇墿鍝佸拰涓涓閲忎負V鐨勮儗鍖呫?span style="COLOR: rgb(255,0,0)">絎琲縐嶇墿鍝佹渶澶氭湁n[i]浠跺彲鐢?/span>錛屾瘡浠惰垂鐢ㄦ槸c[i]錛屼環鍊兼槸w[i]銆傛眰瑙e皢鍝簺鐗╁搧瑁呭叆鑳屽寘鍙嬌榪欎簺鐗╁搧鐨勮垂鐢ㄦ誨拰涓嶈秴榪囪儗鍖呭閲忥紝涓斾環鍊兼誨拰鏈澶с?/p>
姣旇緝涓変釜棰樼洰錛屼細鍙戠幇涓嶅悓鐐瑰湪浜庢瘡縐嶈儗鍖呯殑鏁伴噺錛?1鑳屽寘鏄瘡縐嶅彧鏈変竴浠訛紝瀹屽叏鑳屽寘鏄瘡縐嶆棤闄愪歡錛岃屽閲嶈儗鍖呮槸姣忕鏈夐檺浠躲?/p>
鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺?#8211; 鍏堟潵鍒嗘瀽01鑳屽寘錛?/p>
01鑳屽寘錛圸eroOnePack錛? 鏈塏浠剁墿鍝佸拰涓涓閲忎負V鐨勮儗鍖呫傦紙姣忕鐗╁搧鍧囧彧鏈変竴浠訛級絎琲浠剁墿鍝佺殑璐圭敤鏄痗[i]錛屼環鍊兼槸w[i]銆傛眰瑙e皢鍝簺鐗╁搧瑁呭叆鑳屽寘鍙嬌浠峰兼誨拰鏈澶с?/p>
榪欐槸鏈鍩虹鐨勮儗鍖呴棶棰橈紝鐗圭偣鏄細姣忕鐗╁搧浠呮湁涓浠訛紝鍙互閫夋嫨鏀炬垨涓嶆斁銆?/p>
鐢ㄥ瓙闂瀹氫箟鐘舵侊細鍗砯[i][v]琛ㄧず鍓峣浠剁墿鍝佹伆鏀懼叆涓涓閲忎負v鐨勮儗鍖呭彲浠ヨ幏寰楃殑鏈澶т環鍊箋傚垯鍏剁姸鎬佽漿縐繪柟紼嬩究鏄細 *榪欓噷f[v]灝辯浉褰撲簬浜屼綅鏁扮粍鐨刦[i][v]銆傞偅涔堬紝濡備綍寰楀埌f[i-1][v]鍜宖[i-1][v-c[i]]+w[i]錛燂紙閲嶇偣錛佹濊冿級 榪欏氨鏄叧閿紒 鍒嗘瀽涓婇潰鐨勪唬鐮侊細褰撳唴寰幆鏄嗗簭鏃訛紝灝卞彲浠ヤ繚璇佸悗涓涓猣[v]鍜宖[v-c[i]]+w[i]鏄墠涓鐘舵佺殑錛?br>榪欓噷緇欏ぇ瀹朵竴緇勬祴璇曟暟鎹細 嫻嬭瘯鏁版嵁錛?br>10,3 榪欎釜鍥捐〃鐢誨緱寰堝ソ錛屽熸鏉ュ垎鏋愶細 C[v]浠庣墿鍝乮=1寮濮嬶紝寰幆鍒扮墿鍝?錛屾湡闂達紝姣忔閫嗗簭寰楀埌瀹歸噺v鍦ㄥ墠i浠剁墿鍝佹椂鍙互寰楀埌鐨勬渶澶у箋傦紙璇峰湪鑽夌ǹ綰鎬笂鑷繁鐢諱竴鐢?/span>錛?/p>
榪欓噷浠ヤ竴閬撻鐩潵鍏蜂綋鐪嬬湅錛?/p>
棰樼洰錛?a style="COLOR: rgb(41,112,166); TEXT-DECORATION: none" >http://acm.hdu.edu.cn/showproblem.php?pid=2602 浠g爜鍦ㄨ繖閲岋細http://www.wutianqi.com/?p=533 鍒嗘瀽錛?/p>
鍏蜂綋鏍規嵁涓婇潰鐨勮В閲婁互鍙婃垜緇欏嚭鐨勪唬鐮佸垎鏋愩傝繖棰樺緢鍩虹錛岀湅鎳備笂闈㈢殑鐭ヨ瘑搴旇灝變細鍋氫簡銆?/p>
鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺?#8211; 瀹屽叏鑳屽寘錛?/strong> 瀹屽叏鑳屽寘(CompletePack): 鏈塏縐嶇墿鍝佸拰涓涓閲忎負V鐨勮儗鍖咃紝姣忕鐗╁搧閮芥湁鏃犻檺浠跺彲鐢ㄣ傜i縐嶇墿鍝佺殑璐圭敤鏄痗[i]錛屼環鍊兼槸w[i]銆傛眰瑙e皢鍝簺鐗╁搧瑁呭叆鑳屽寘鍙嬌榪欎簺鐗╁搧鐨勮垂鐢ㄦ誨拰涓嶈秴榪囪儗鍖呭閲忥紝涓斾環鍊兼誨拰鏈澶с?/p>
瀹屽叏鑳屽寘鎸夊叾鎬濊礬浠嶇劧鍙互鐢ㄤ竴涓簩緇存暟緇勬潵鍐欏嚭錛?/p>
鎯沖繀澶у鐪嬪嚭浜嗗拰01鑳屽寘鐨勫尯鍒紝榪欓噷鐨勫唴寰幆鏄『搴忕殑錛岃?1鑳屽寘鏄嗗簭鐨勩?br>鐜板湪鍏抽敭鐨勬槸鑰冭檻錛氫負浣曞畬鍏ㄨ儗鍖呭彲浠ヨ繖涔堝啓錛?br>鍦ㄦ鎴戜滑鍏堟潵鍥炲繂涓嬶紝01鑳屽寘閫嗗簭鐨勫師鍥狅紵鏄負浜嗘槸max涓殑涓ら」鏄墠涓鐘舵佸鹼紝榪欏氨瀵逛簡銆?/span> 棰樼洰錛?a style="COLOR: rgb(41,112,166); TEXT-DECORATION: none" >http://acm.hdu.edu.cn/showproblem.php?pid=1114 浠g爜錛?a style="COLOR: rgb(41,112,166); TEXT-DECORATION: none" >http://www.wutianqi.com/?p=535 錛堝垎鏋愪唬鐮佷篃鏄涔犵畻娉曠殑涓縐嶉斿緞錛屾湁鏃跺茍涓嶄竴瀹氳鐪嬬畻娉曞垎鏋愶紝緇撳悎棰樼洰鍙嶈屾洿瀹規槗鐞嗚В銆傦級 鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺?#8211; 澶氶噸鑳屽寘 澶氶噸鑳屽寘(MultiplePack): 鏈塏縐嶇墿鍝佸拰涓涓閲忎負V鐨勮儗鍖呫傜i縐嶇墿鍝佹渶澶氭湁n[i]浠跺彲鐢紝姣忎歡璐圭敤鏄痗[i]錛屼環鍊兼槸w[i]銆傛眰瑙e皢鍝簺鐗╁搧瑁呭叆鑳屽寘鍙嬌榪欎簺鐗╁搧鐨勮垂鐢ㄦ誨拰涓嶈秴榪囪儗鍖呭閲忥紝涓斾環鍊兼誨拰鏈澶с?/p>
榪欓鐩拰瀹屽叏鑳屽寘闂寰堢被浼箋傚熀鏈殑鏂圭▼鍙渶灝嗗畬鍏ㄨ儗鍖呴棶棰樼殑鏂圭▼鐣ュ井涓鏀瑰嵆鍙紝鍥犱負瀵逛簬絎琲縐嶇墿鍝佹湁n[i]+1縐嶇瓥鐣ワ細鍙?浠訛紝鍙?浠?#8230;…鍙杗[i]浠躲備護f[i][v]琛ㄧず鍓峣縐嶇墿鍝佹伆鏀懼叆涓涓閲忎負v鐨勮儗鍖呯殑鏈澶ф潈鍊鹼紝鍒欐湁鐘舵佽漿縐繪柟紼嬶細 榪欓噷鍚屾牱杞崲涓?1鑳屽寘錛?/p>
鏅氱殑杞崲瀵逛簬鏁伴噺杈冨鏃訛紝鍒欏彲鑳戒細瓚呮椂錛屽彲浠ヨ漿鎹㈡垚浜岃繘鍒訛紙鏆傛椂涓嶄簡瑙o紝鎵浠ュ厛涓嶈錛?/p>
瀵逛簬鏅氱殑銆傚氨鏄浜嗕竴涓腑闂寸殑寰幆錛屾妸j=0~bag[i]錛岃〃紺烘妸絎琲涓儗鍖呬粠鍙?浠舵灇涓懼埌鍙朾ag[i]浠躲?/p>
緇欏嚭涓涓緥棰橈細 棰樼洰錛?a style="COLOR: rgb(41,112,166); TEXT-DECORATION: none" >http://acm.hdu.edu.cn/showproblem.php?pid=2191 浠g爜錛?a style="COLOR: rgb(41,112,166); TEXT-DECORATION: none" >http://www.wutianqi.com/?p=537 鍥犱負闄愪簬涓漢鐨勮兘鍔涳紝鎴戝彧鑳借鍑轟釜澶ф錛岃澶у鍏蜂綋榪樻槸濂藉ソ鐪嬬湅dd澶х墰鐨勩婅儗鍖呬節璁層嬨?/p>
鏆傛椂璁插畬鍚庯紝闅忕潃浠ュ悗鏇存繁鍏ョ殑浜嗚В錛屾垜浼氭妸璧勬枡緇х畫瀹屽杽錛屼緵澶у涓璧峰涔犳帰璁ㄣ?鎴戠殑鍗氬錛?a style="COLOR: rgb(41,112,166); TEXT-DECORATION: none" >www.wutianqi.com濡傛灉澶у鏈夐棶棰樻垨鑰呰祫鏂欓噷鐨勫唴瀹規湁閿欒錛屽彲浠ョ暀璦緇欏嚭錛岃阿璋㈡偍鐨勬敮鎸併? 鍘熸枃涓嬭澆鍦板潃錛氾紙Word鐗堬級
]]>
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
鎶婅繖涓繃紼嬬悊瑙d笅錛氬湪鍓峣浠剁墿鍝佹斁榪涘閲弙鐨勮儗鍖呮椂錛?/code>瀹冩湁涓ょ鎯呭喌錛?/code>絎竴縐嶆槸絎琲浠朵笉鏀捐繘鍘伙紝榪欐椂鎵寰椾環鍊間負:f[i-1][v]絎簩縐嶆槸絎琲浠舵斁榪涘幓錛岃繖鏃舵墍寰椾環鍊間負錛歠[i-1][v-c[i]]+w[i]錛堢浜岀鏄粈涔堟剰鎬濓紵灝辨槸濡傛灉絎琲浠舵斁榪涘幓錛岄偅涔堝湪瀹歸噺v-c[i]閲屽氨瑕佹斁榪涘墠i-1浠剁墿鍝侊級鏈鍚庢瘮杈冪涓縐嶄笌絎簩縐嶆墍寰椾環鍊肩殑澶у皬錛屽摢縐嶇浉瀵瑰ぇ錛宖[i][v]鐨勫煎氨鏄摢縐嶃?/code>錛堣繖鏄熀紜錛岃鐞嗚В錛侊級榪欓噷鏄敤浜屼綅鏁扮粍瀛樺偍鐨勶紝鍙互鎶婄┖闂翠紭鍖栵紝鐢ㄤ竴浣嶆暟緇勫瓨鍌ㄣ?/code>鐢╢[0..v]琛ㄧず錛宖[v]琛ㄧず鎶婂墠i浠剁墿鍝佹斁鍏ュ閲忎負v鐨勮儗鍖呴噷寰楀埌鐨勪環鍊箋傛妸i浠?~n(n浠?寰幆鍚庯紝鏈鍚巉[v]琛ㄧず鎵姹傛渶澶у箋?/code>
棣栧厛瑕佺煡閬擄紝鎴戜滑鏄氳繃i浠?鍒皀鐨勫驚鐜潵渚濇琛ㄧず鍓峣浠剁墿鍝佸瓨鍏ョ殑鐘舵併傚嵆錛歠or i=1..N
鐜板湪鎬濊冨浣曡兘鍦ㄦ槸f[v]琛ㄧず褰撳墠鐘舵佹槸瀹歸噺涓簐鐨勮儗鍖呮墍寰椾環鍊鹼紝鑰屽張浣縡[v]鍜宖[v-c[i]]+w[i]鏍囩鍓嶄竴鐘舵佺殑浠峰鹼紵閫嗗簭錛?/span>
3,4
4,5
5,6f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}鍚屾牱鍙互杞崲鎴愪竴緇存暟緇勬潵琛ㄧず錛?/code>浼唬鐮佸涓嬶細欏哄簭錛?/span>
閭d箞榪欓噷錛屾垜浠『搴忓啓錛岃繖閲岀殑max涓殑涓ら」褰撶劧灝辨槸褰撳墠鐘舵佺殑鍊間簡錛屼負浣曪紵
鍥犱負姣忕鑳屽寘閮芥槸鏃犻檺鐨勩傚綋鎴戜滑鎶奿浠?鍒癗寰幆鏃訛紝f[v]琛ㄧず瀹歸噺涓簐鍦ㄥ墠i縐嶈儗鍖呮椂鎵寰楃殑浠峰鹼紝榪欓噷鎴戜滑瑕佹坊鍔犵殑涓嶆槸鍓嶄竴涓儗鍖咃紝鑰屾槸褰撳墠鑳屽寘銆傛墍浠ユ垜浠鑰冭檻鐨勫綋鐒舵槸褰撳墠鐘舵併?/span>
榪欓噷鍚屾牱緇欏ぇ瀹朵竴閬撻鐩細f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}
http://download.csdn.net/source/2587577
棰樼洰鍦板潃錛?br>http://acm.hdu.edu.cn/showproblem.php?pid=1171
澶氶噸鑳屽寘鐨勯鐩? 鍙互鐩存帴杞崲鎴?0-1鑳屽寘鏉ュ仛, 鍥犱負鏄鍒嗘垚灝介噺鐩哥瓑鐨?閮ㄥ垎, 鎵浠?鑳屽寘澶у皬 sum / 2 灝卞彲浠ヤ簡.
鍙﹀, 榪樻湁涓鐐硅娉ㄦ剰 , 緇撴潫鏉′歡鏄?闈炶礋鏁? 鑰屼笉鏄?-1 !! 鎴戝湪榪欓噷 TLE浜嗕竴涓嬪崍............YM
浠g爜濡備笅 :
#include <iostream>
using namespace std;
int V[51];
int M[51];
int bst[125005];
int main ()
{
int N;
while ( scanf ( "%d",&N ), N > 0 )
{
int sum = 0;
for ( int i = 1; i <= N; ++ i )
{
scanf ( "%d%d",&V[i], &M[i] );
sum += V[i] * M[i];
}
int total = sum;
sum /= 2;
memset ( bst, 0 , sizeof ( bst ) );
for ( int i = 1; i <= N; ++ i )
{
for ( int j = 1; j <= M[i]; ++ j )
{
for ( int k = sum; k >= V[i] ; k -= V[i] )
{
if ( bst[ k - V[i] ] + V[i] > bst[k] )
{
bst[k] = bst[ k - V[i] ] + V[i] ;
}
}
}
}
int other = total - bst[sum];
if ( other > bst[sum] )
{
swap ( other, bst[sum] );
}
printf ( "%d %d\n", bst[sum], other );
}
return 0;
}
涓嬮潰鐨勬槸濂嬫枟鍝ョ殑浠g爜 ,:
// HDOJ 1171
#include <iostream>
using namespace std;
int c1[250010], c2[250010];
int value[55];
int amount[55];
int main()
{
int nNum;
while(scanf("%d", &nNum) && nNum>0)
{
memset(value, 0, sizeof(value));
memset(amount, 0, sizeof(amount));
int sum = 0;
for(int i=1; i<=nNum; ++i)
{
scanf("%d %d", &value[i], &amount[i]);
sum += value[i]*amount[i];
}
memset(c1, 0, sum*sizeof(c1[0]));
memset(c2, 0, sum*sizeof(c2[0]));
for(int i=0; i<=value[1]*amount[1]; i+=value[1])
c1[i] = 1;
int len = value[1]*amount[1];
for(int i=2; i<=nNum; ++i)
{
for(int j=0; j<=len; ++j)
for(int k=0; k<=value[i]*amount[i]; k+=value[i])
{
c2[k+j] += c1[j];
}
len += value[i]*amount[i];
for(int j=0; j<=len; ++j)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
for(int i= sum/2; i>=0; --i)
if(c1[i] != 0)
{
printf("%d %d\n", sum-i, i);
break;
}
}
return 0;
}
]]>