(JAVA)0/1背包问题-蛮力法

简单写了一下0/1背包的算法解释

无论哪种语言,基本上都是这个思路:

1. 初始化最大价值 maxValue=0;结果子集 S=重;

2. 对集合{1,2,…,n)的每一个子集T,执行下述操作:

        2.1 初始化背包的价值 value=0;背包的重量 weight=0;

        2.2 对子集T的每一个元素j

                2.2.1 如果 weight+wj;<C,则 weight=weight+wj;value=value+vj;

                2.2.2 否则,转步骤2考察下一个子集;

        2.3 如果 maxValue<value,则 maxValue=value; S=T;

3. 输出子集S中的各元素;

都要查询2^n次的子集数量

一开始使用int数组【】来作为子方法中存储背包的序列,但数组不好实现动态自增长度,

转从设置ArrayList,尝试构建可以保存变化的背包序列。

import java.util.ArrayList;

public class 背包0_1 {

    static int[] we={7,3,4,5},  va={42,12,40,25};
    public static void main(String[] args) {
        int maxValue=0, n=0;
//只需要传入maxValue这个总变量即可
        System.out.println("最大值:"+check(maxValue));


    }
    private static int check(int maxValue){
        ArrayList<Integer> N=new ArrayList<>();
//方法1  //int[] S=new int[4],N=new int[S.length] ;
        for (int j = 0;  j<we.length; j++) {
            ArrayList<Integer> S = new ArrayList<Integer>();
            int value=0,weight=0,i = 0,n=0;
            i=j;
            while (i<=3) {

                if (weight + we[i] <= 10) {
                    weight += we[i];
                    value += va[i];
                    //System.out.println(maxValue + "第几次运行:" + n);  //测试。。。。
//方法1              //S[n] = we[i];
                    S.add(we[i]);
                    n++;
                }
                i++;
                //System.out.println("循环"+i);       //测试。。。。。
            }

                //System.out.println("for循环"+j);   //测试。。。。。
            if(maxValue<value){
                maxValue=value;
               N= (ArrayList<Integer>) S.clone();                  //这里主要是克隆一下数组
//
            }
        }
        for (int k:N
        ) {
            System.out.print(k+" ");
        }
        return maxValue;
    }

}

如果需要改变背包材料的重量和数量

static int[] we={7,3,4,5},  va={42,12,40,25};

将这一行代码删除,换成Scanner或者BufferedReader输入你想要的数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值