背包问题之多重背包

package com.zhang.reflection.面试.算法模版.背包问题模版;

/**
 * 有N种物品和一个容量为V的背包。第i种物品最多有p[i]件可用,每件费用是w[i],价值是v[i]。
 * 求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
 */

public class 多重背包 {
    public static void main(String[] args) {
        //物品个数
        int numbers = 4;
        //背包容量
        int capacity = 5;
        //个体容量
        int[] weight = {1, 2, 3, 4};
        //个体价值
        int[] values = {2, 4, 4,5};
        //第i种物品最多有p[i]件可用
        int[] p = {3, 1, 3, 2};
        //当前背包容量 j的物品最佳组合对应的价值
        int[] v = new int[capacity + 1];
        //这是未优化的版本:根据01背包思路,但是可能会超时
//        for(int i=0;i<numbers;i++){
//            for(int j=capacity;j>=weight[i];j--){
//                for(int k=0;k<=p[i]&&j>=k*weight[i];k++){
//                    v[j]=Math.max(v[j],v[j-k*weight[i]]+k*values[i]);
//                }
//            }
//        }

//        这是优化之后的版本(回头看看背包九讲...):
        for (int i = 0; i < numbers ; i++) {
            //每次增长一倍,减少计算量
            int num = Math.min(p[i], capacity / weight[i]);
            for (int k = 1; num > 0; k <<= 1) {
                if (k > num) {
                    k = num;
                }
                num = num - k;
                for (int j = capacity; j >= weight[i] * k; j--) {
                    v[j] = Math.max(v[j], v[j - weight[i] * k] + values[i] * k);
                }
            }
        }
        System.out.println(v[capacity]);
    }
}
全部评论

相关推荐

Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
运营你豪哥:简历改改吧-非本、求职意向技术岗、无实习经历、内容空洞 如果简历不爆改的话,应该是会持续崩溃了 1.把你教育经历放最下面去 2.蓝底照片很奇怪哈,感觉还在高中时代,建议白底重新拍一下 3.校园经历没啥必要,收集和反馈同学们对产品的意见,解决学生和老师之间的沟通,企业招聘不看这些哈 好好思考一下简历的设计和你要表达的重点,再去投简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务