0
点赞
收藏
分享

微信扫一扫

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

朱悟能_9ad4 2022-03-11 阅读 69

标题: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 条评论