java分支限界法解决背包问题_(Java)分支界限法求解背包问题

1.代码

package com.test;

import java.util.*;

public class Main {

static double c;

static int n;

static double w[];

static double p[];

static double cw;

static double cp;

static int bestX[];

static MaxHeap heap;

//上界函数bound计算结点所相应价值的上界

private static double bound(int i){

double cleft=c-cw;

double b=cp;

while(i<=n&&w[i]<=cleft){

cleft=cleft-w[i];

b=b+p[i];

i++;

}

//装填剩余容量装满背包

if(i<=n)

b=b+p[i]/w[i]*cleft;

return b;

}

//addLiveNode将一个新的活结点插入到子集树和优先队列中

private static void addLiveNode(double up,double pp,double ww,int lev,BBnode par,boolean ch){

//将一个新的活结点插入到子集树和最大堆中

BBnode b=new BBnode(par,ch);

HeapNode node =new HeapNode(b,up,pp,ww,lev);

heap.put(node);

}

private static double MaxKnapsack(){

//优先队列式分支限界法,返回最大价值,bestx返回最优解

BBnode enode=null;

int i=1;

double bestp=0;//当前最优值

double up=bound(1);//当前上界

while(i!=n+1){//非叶子结点

//检查当前扩展结点的左儿子子结点

double wt=cw+w[i];

if(wt<=c){

if(cp+p[i]>bestp)

bestp=cp+p[i];

addLiveNode(up,cp+

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值