public double knapsack(double[] pp,double[] ww,double cc){ //初始化 c=cc; n=pp.length-1; cw=0; cp=0; bestp=0; x=new int[n+1]; bestx=new int[n+1]; //q为单位重量价值数组 q=new Element[n+1]; for(int i=0;i<=n;i++){ q[i]=new Element(i,pp[i]/ww[i]); } //将个物品依单位重量价值从大到小排列 java.util.Arrays.sort(q); //MergeSort.mergeSort(q); p=new double[n+1]; w=new double[n+1]; for(int i=1;i<=n;i++){ p[i]=pp[q[i].id]; w[i]=ww[q[i].id]; } backtrack(1); return bestp; } public void backtrack(int i){ if(i>n){//到达叶子节点 bestp=cp; for(int j=1;j<=n;j++){//保存最优值对应的包的编号 bestx[j]=x[j]; } return; } if(cw+w[i]<=c){//左子树 x[i]=1; cw+=w[i]; cp+=p[i]; backtrack(i+1); cw-=w[i];//恢复现场 cp-=p[i]; } if(bound(i+1)>bestp){ x[i]=0; backtrack(i+1); } } public double bound(int i){//上界函数 double cleft=c-cw; double bound=cp; while(i<=n&&w[i]<=cleft){ cleft-=w[i]; bound+=p[i]; i++; } if(i<=n){ bound+=p[i]*cleft/w[i]; } return bound; } public static void main(String[] args) { double[] weight= {3,5,7,8,9}; double[] price= {4,6,7,9,10}; double cc=100; knapsack1 k=new knapsack1(); double best=k.knapsack(price,weight,cc); System.out.println("最优值:"+best); System.out.println("选中的物品编号分别是:"); for(int i=1;i<k.bestx.length;i++){ if(k.bestx[i]==1){ System.out.print(k.q[i].id+" ");这段代码每行啥意思
时间: 2024-01-22 09:04:23 浏览: 63
qingwa.rar_0/1 knapsack problem_knapsack c
这段代码实现了一个 0/1 背包问题的解法。其中,`knapsack` 方法接收三个参数:`pp` 表示每个物品的价值,`ww` 表示每个物品的重量,`cc` 表示背包的容量。在方法内部,首先将物品按照单位重量价值从大到小排序,然后通过回溯算法求出最优解。具体来说,回溯算法通过递归遍历决策树来找到最优解,其中的 `backtrack` 方法表示回溯的过程,`bound` 方法表示求解上界的函数。最后,打印出选中的物品编号以及最优值。
阅读全文