回溯法解决01背包问题(Java)

先前用C语言很容易实现了一个回溯算法,但转到Java后由于面向对象的原因,一时不知道如何处理变量。今天学习了static和final关键字,正好做一个练习。
static: 定义一个类变量,使当前变量可以此类中的任意方法访问
final: 定义一个常量

package Foundation;

/**
 * @PackageName: Foundation
 * @ClassName: Bag
 * @Description: 回溯法实现01背包问题及final, static关键字的使用
 * @Author: codeslogan
 * @Date: 2021-09-02 16:00
 */
public class Bag {

    static final int N = 3;  //3件物品
    static final int W = 16; //限重16
    static int []w = {10, 8, 5}; //每件物品的重量
    static int []v = {5, 4, 1}; //每件物品的价值
    static int curValue; //记录当前的价值
    static int curWeight;
    static int bestValue;
    static int []x = new int[3];
    static int []bestX = new int[3];
    public static void main(String[] args) {
        backtracking(0);

        System.out.println("最大利润为: " + bestValue);
        for (int i = 0; i < N; i++) {
            System.out.println(bestX[i]);
        }
    }

    public static void backtracking(int k) {
        if (k > N-1) {  //递归基,结算并退出此重调用
            if (bestValue < curValue) {
                bestValue = curValue;
                for (int i = 0; i < N; i++) {
                    bestX[i] = x[i];
                }
            }
        }
        else {
            for (int i = 0; i <= 1; i++) { //循环01
                x[k] = i;
                if (i == 0) {
                    backtracking(k+1);
                }
                else {
                    if (curWeight + w[k] < W) {
                        curWeight += w[k];
                        curValue += v[k];
                        backtracking(k+1);
                        curWeight -= w[k]; //回溯后还原原先情况
                        curValue -= v[k];
                    }
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeSlogan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值