180419爱奇艺笔试分糖果问题:用Dp解决回溯?

回溯解法如下:

public class Main {
    static int count=0;
    public static void main(String[] args) {
        String s="aaa";
        int index=1;
        StringBuilder sb=new StringBuilder();
        sb.append(s.substring(index+1));
        System.out.println(sb);
        Scanner in = new Scanner(System.in);
        int n,m;
        n = in.nextInt();
        m = in.nextInt();
        int[][] candy=new int[n][2];
        for(int i=0;i<n;i++){
            candy[i][0]=in.nextInt();
            candy[i][1]=in.nextInt();
        }
        for(int i=0;i<n;i++){
            m-=candy[i][0];
            candy[i][1]-=candy[i][0];
        }
        helper(n,m,candy,0,0);
        System.out.println(count);
    }
    static void helper(int n,int m,int[][] candy,int size,int index){
        System.out.println("index"+index);
        System.out.println("size"+size);
        if(size==m) {
            count++;
            System.out.println("count"+count);
            return;
        }
        for(int i=index;i<n;i++){
            if(candy[i][1]>0){
                candy[i][1]--;
                helper(n,m,candy,++size,i);
                candy[i][1]++;
                size--;
            }
        }
    }
}
DP解法如下:

public class AiQYI3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();// 颜色种类
        int m = scanner.nextInt();// 盒子放置m个糖果
        int[] l = new int[n];
        int[] r = new int[n];
        int least = 0;
        int[] avaliable = new int[n];// 表示每一种颜色剩余可以加的
        for (int i = 0; i < r.length; i++) {
            l[i] = scanner.nextInt();
            r[i] = scanner.nextInt();
            least += l[i];
            avaliable[i] = r[i] - l[i];
        }
        int target = m - least; //dp[i][j]表示前i种糖果装满容量为j的背包的方法数。一定要用long,不然会爆,只能过70% long[][] dp = new long[n + 1][target + 1];
        for (int i = 0; i < dp.length; i++) {
            dp[i][0] = 1;//初始化
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= target; j++) {
                for (int k = 0; k <= avaliable[i - 1]; k++) {
                    if (j - k >= 0)
                        dp[i][j] += dp[i - 1][j - k];
                }
            }
        }
        System.out.println(dp[n][target]);
    }
}


想明白再写。

猜你喜欢

转载自blog.csdn.net/bysoulwarden/article/details/80015734