dp算法 优化 在优化

阅读 76

2022-02-12

    public static int process(int[] arr,int index,int rest){
        if(index == arr.length){
            return rest == 0 ? 1 : 0;
        }

        int ways = 0;
        for(int zhang = 0;arr[index] * zhang <= rest;zhang++){
            ways += process(arr,index+1,rest-arr[index]*zhang);
        }
        return ways;
    }
   
   优化后
   public static int way2(int[] arr,int aim){
        if(arr == null || arr.length == 0){
            return 0;
        }
        int N = arr.length;
        int[][]  dp = new int[N+1][aim+1];
        dp[N][0] = 1;
        for(int index = N-1;index >= 0;index--){
            for(int rest = 0;rest <= aim;rest++){
                int ways = 0;
                for(int zhang = 0;arr[index]* zhang <= rest;zhang++){
                    ways = dp[index+1][rest-arr[index]*zhang];
                }
                dp[index][rest] = ways;
            }
        }
        return dp[0][aim];
    }

    public static int way3(int[] arr,int aim){
        if(arr == null || arr.length == 0){
            return 0;
        }
        int N = arr.length;
        int[][]  dp = new int[N+1][aim+1];
        dp[N][0] = 1;
        for(int index = N-1;index >= 0;index--){
            for(int rest = 0;rest <= aim;rest++){
                dp[index][rest] = dp[index+1][rest];
                if(rest - arr[index] >= 0){
                    dp[index][rest] += dp[index][rest-arr[index]];
                }
            }
        }
        return dp[0][aim];
    }

精彩评论(0)

0 0 举报