1.一个数组,求数组中部分元素满足targer的组合的个数。典型的0-1背包问题

public int pack(int[] nums,int target){
        int n = nums.length;
        int[][] dp = new int[n+1][target+1];
        dp[0][0] =1;
        for(int i = 1;i<=n;i++){
            for(int j = 0;j<=target;j++){
                if(j - nums[i-1] <0){
                    dp[i][j] = dp[i-1][j];
                }else{
                    dp[i][j] = dp[i-1][j] + dp[i-1][j-nums[i-1]];
                }

            }
        }
        return dp[n][target];
    }

可以进行优化,映射到一维:

public int pack(int[] nums,int target){
        int n = nums.length;
        int[] dp = new int[target+1];
        dp[0] =1;
        for(int i = 1;i<=n;i++){
            for(int j = target;j>=nums[i-1];j--){
                   dp[j] = dp[j] + dp[j-nums[i-1]];
                }   
            }
        }
        return dp[target];
    }

2.一个球的回溯问题:大致为有n个白球和m个黑球,将他们从左到右排成一排,满足一个条件:对于每一个i满足1<=i<=m+n,记录从第一个球到第i个球中的白球数量为w,黑球数量为b,满足w<=b+k,求一个有多少种满足条件的排列?
最后结果取余10^9+7

3.马走日问题