01背包问题使用递归和非递归

标题:01背包问题使用递归和非递归

见视频:添加链接描述

在这里插入图片描述在这里插入图片描述F(k,w),k:前几件物品可以偷,w,当前背包容量
在这里插入图片描述

package com.suanfa;

import javafx.beans.WeakInvalidationListener;

import java.util.Arrays;

/**
01背包问题
 01背包问题:https://www.bilibili.com/video/BV1g7411B7SP?spm_id_from=333.999.0.0

 **/
public class TestDp5 {
    int[] weight;//重量
    int[] value;//价值
    public static void main(String[] args) {
        TestDp5 testDp = new TestDp5();
        System.out.println(testDp.test(new int[]{2,3,4,5},new int[]{3,4,5,8},4 ,8));
        System.out.println(testDp.fun2(new int[]{2,3,4,5},new int[]{3,4,5,8},4 ,8));


    }
    //方法一,使用递归,fun
    public int test(int[] weight,int[] value,int n,int m){
        this.weight = weight;
        this.value = value;

        return fun(n - 1,m);
    }
    public int fun(int n,int m){
        if(n == 0 || m == 0){
            return 0;
        }
        int m1 = 0;
        //可以装入
        if(m - weight[n] >= 0){
            m1 = fun(n-1,m - weight[n]) + value[n];
        }
        //不装入
        int m2 = fun(n-1,m);

        //两者的最大值
        return m1 > m2? m1:m2;
    }

    //方法二:不用递归
    public int fun2(int[] weight,int[] value,int k,int w){  // 4 8
        //可能遇到f(0,x)之类的,所以
        int[][] arr = new int[k+1][w+1];

        for(int i = 1;i <= k;i++){//次数
            for(int j = 1;j <= w;j++){//重量
                int m1 = 0;
                if(j >= weight[i-1]){//偷
                    m1 = arr[i-1][j - weight[i-1]] + value[i-1];
                }
                int m2 = arr[i-1][j];//不偷
                arr[i][j] = m1 > m2? m1:m2;
            }
        }

//        for(int i = 1;i <= k;i++){//次数
//            for(int j = 1;j <= w;j++){//重量
//                System.out.printf("f[%d][%d]=%d\n",i,j,arr[i][j]);
//            }
//        }

        return arr[k][w];
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值