问题:有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<