分支界限法 0-1背包问题 java

本文介绍了如何运用分支界限法解决0-1背包问题。通过创建商品类和背包类,对商品按性价比排序,并进行遍历,考虑放入或不放入每个商品的情况,以找到价值最大化的解决方案。最终实现的时间复杂度为O(2^n)。

问题:有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求 解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

思路:创建两个类。第一个类是商品类。商品们做个预处理。全部放到一个列表里。再按照性价比排序。还有是背包类。里面存放着,最大可能价值,还能存放的重量,还有其父亲类。总价值等。然后我们开始遍历。无非就两种情况。放入和不放入。乱入状态加个1,不放入状态加个0.然后都要求个最大可能价值。得出价值的方式就是挺的放后面的数,放爆了就放把爆之前剩余的体积乘与后一个商品的平均单价。
最后求出一组最大可能性。时间复杂度时间复杂度为O(2^n)。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.PriorityQueue;

public class BagProblem 
{
    int[] price={
  
  10,14,20,9}; //每个东西的价格
    int[] weight={
  
  5,7,10,3};  //每个东西的重量
    int max=19;               //最多存储重量
    List<Produce> list=new ArrayList<Produce>();//春芳商品的列表,按照价值从大到小排
    PriorityQueue<Bag> heap=new PriorityQueue<Bag>((a,b)->{
  
  return (b.maxPrice-a.maxPrice)==0?b.reWeight-a.reWeight:b.maxPrice-a.maxPrice;});//存放当前背包的状态
    List<Bag> result=new ArrayList<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值