动态规划背包的改进算法java代码.doc
- 文档编号:234839
- 上传时间:2022-10-07
- 格式:DOC
- 页数:2
- 大小:15KB
动态规划背包的改进算法java代码.doc
《动态规划背包的改进算法java代码.doc》由会员分享,可在线阅读,更多相关《动态规划背包的改进算法java代码.doc(2页珍藏版)》请在冰豆网上搜索。
importjava.lang.*;
importjava.io.*;
publicclassSiyu
{publicstaticvoidTraceback(intn,intw[],intv[],intp[][],int[]head,intx[])
{
intj=p[head[0]-1][0],m=p[head[0]-1][1];
for(inti=1;i<=n;i++){
x[i]=0;
for(intk=head[i+1];k<=head[i]-1;k++){
if(p[k][0]+w[i]==j&&p[k][1]+v[i]==m){
x[i]=1;j=p[k][0];m=p[k][1];break;
}
}
}
}
publicstaticintknapsack(intn,intc,intv[],intw[],intp[][],intx[])//p[i][0]表示跳跃点的j值,p[i][1]表示跳跃点的m(i,j)值
{
int[]head=newint[n+2];//head[i]表示p[i]中点在数组p中的起始位置,head[0]没用
head[n+1]=0;p[0][0]=0;p[0][1]=0;
intleft=0,right=0,next=1;//(left..right)表示p[i+1]中点在数组p中的上下界,next表示p[i]中的点在数组p中的插入位置
head[n]=1;
for(inti=n;i>=1;i--){//形成p[i]中的点
intk=left;//p[k]表示p[i+1]中点,p[next]表示p[i]中点
for(intj=left;j<=right;j++){//形成q[i+1]中的点
if(p[j][0]+w[i]>c)break;
inty=p[j][0]+w[i],m=p[j][1]+v[i];
//处理q[i+1]中点(y,m)
while(k<=right&&p[k][0] p[next][0]=p[k][0]; p[next++][1]=p[k++][1]; } if(k<=right&&p[k][0]==y){//处理p[i+1]中与y相同的已有点,需比较价值的大小 if(m k++; } if(m>p[next-1][1])//插入(y,m)到p[i]中 {p[next][0]=y;p[next++][1]=m;} while(k<=right&&p[k][1]<=p[next-1][1])k++; //消除多个受控点 }//endforj while(k<=right){//插入所有(y,m)后,原p[i+1]中比y大的点插入到p[i]中 p[next][0]=p[k][0];p[next++][1]=p[k++][1]; } left=right+1;right=next-1;head[i-1]=next; } System.out.print("跳跃点为: "); for(inti=0;i System.out.print("(p["+i+"]["+0+"],p["+i+"]["+1+"])"+""); System.out.println(); Traceback(n,w,v,p,head,x); returnp[next-1][1]; } publicstaticvoidmain(String[]args){ intn=5,c=10; intv[]={0,6,3,5,4,6}; intw[]={0,2,2,6,5,4}; intp[][]=newint[21][21]; intx[]=newint[6]; intmaxV=knapsack(n,c,v,w,p,x); System.out.println("最大值是: "+maxV); System.out.print("最优解是: "); for(inti=0;i<=n;i++) System.out.print(""+x[i]); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 规划 背包 改进 算法 java 代码