01背包-记忆型递归

  有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求最大价值

import java.util.*;

public class ll {
    static int[] w={2,1,3,2};
    static int[] v={3,2,4,2};
    static int n=4;
    static int W=5;

    static int dfs(int i,int ww){//O(2^n)复杂度
        if (ww<=0) return 0;//装不进去了
        if (i==n) return 0;//0到n-1,没有容量了
        int v2=dfs(i+1,ww);//不选
        if (ww>=w[i]){
            int v1=v[i]+dfs(i+1,ww-w[i]);//选
            return Math.max(v1,v2);
        }else {
            return v2;
        }
    }

    static int m(int i, int ww){//优化,记忆型递归,减少了重复计算
        if (ww<=0) return 0;
        if (i==n) return 0;
        if (rec[i][ww]>=0){
            return rec[i][ww];
        }
        int ans=0;
        int v2=m(i+1,ww);
        if (ww>=w[i]){
            int v1=v[i]+m(i+1,ww-w[i]);
            ans=Math.max(v1,v2);
        }else {
            rec[i][W]=ans;//把之前求出来的结果存起来
            return ans;
        }
        rec[i][ww]=ans;//把之前求出来的结果存起来
        return ans;
    }
    static int rec[][];
    public static void main(String[] args) {
        int ww=W;
        int ans=dfs(0,ww);
        System.out.println(ans);
        ww=W;
        rec=new int[n][W+1];
        for (int i = 0; i <n ; i++) {
            Arrays.fill(rec[i],-1);
        }

        ans=m(0,ww);
        System.out.println(ans);
    }
}

发布了89 篇原创文章 · 获赞 42 · 访问量 3660

猜你喜欢

转载自blog.csdn.net/weixin_43673156/article/details/105176063