部分背包问题(贪心策略)(使用对象数组)

背包问题和部分背包问题的区别:

  1. 背包问题在最后一个的选择的时候,如果背包容量小于下一个放入物品的容量(且全部物品的容量大于背包容量)则不再放入。
  2. 部分背包问题在最后一个物品选择的时候,若背包容量仍然可以放下部分物品,则将部分物品放入。

public class FK {
    /*
    商品数量 n,各商品的价值 p,各商品的体积 v,背包容量C, 商品性价比Ratio[1,n]
     */
    public static void main(String[] args) {
        System.out.println("name value volume cost_per");
        String[] name = {"汽水 ", "橙汁 ", "苹果汁", "苏打水", "西瓜汁"};
        int[] p = {10, 16, 60, 36, 45};
        int[] v = {250, 100, 600, 200, 300};
        double[] Ratio = new double[p.length];//性价比
        int n = p.length;
        int C = 800;
        for (int b = 0; b < n; b++) {
            Ratio[b] = (double) p[b] / v[b];//性价比=价格/体积
        }
        Juice juice = new Juice();
        //创建对象数组
        Juice[] j = new Juice[n];//传入n个数据
        for (int i = 0; i < n; i++) {
            j[i] = new Juice(name[i], p[i], v[i], Ratio[i]);
        }

        Juice j1 = null;
        for (int i = 0; i < p.length; i++) {//冒泡排序
            for (int d = 0; d < p.length; d++) {
                if (d != p.length - 1)//这里必须加上这个条件,不然数字会报出越界的问题
                    if (j[d].getCost_per() < j[d + 1].getCost_per()) {
                        j1 = j[d + 1];
                        j[d + 1] = j[d];
                        j[d] = j1;
                    }
            }
        }
        for (int a = 0; a < n; a++) {//打印排序之后
            System.out.println(j[a].getJuiceName() + "\t" + j[a].getValue() + "\t" + j[a].getVolume() + "\t" + j[a].getCost_per());
        }


        int i = 0;
        double ans = 0.00;
        System.out.print("选择商品:");
        while (C > 0 && i < n) {
            if (j[i].getVolume() <= C) {//如果体积小于背包容量就选择
                System.out.print(j[i].getJuiceName() + ",");
                ans = ans + j[i].getValue();
                C = C - j[i].getVolume();


            } else {//还剩余C体积,但是不够(还可倒一点)
                System.out.print("再选择" + C + "体积的" + j[i].getJuiceName());
                double p1 = j[i].getValue();
                double v1 = j[i].getVolume();
                ans = ans + (p1 * (C / v1));//整数除如果个位数为0即为0
                C = 0;

            }
            i = i + 1;
        }
        System.out.println("\n所选方案总价格:" + ans);


    }

}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值