第24章 背包问题进阶

2020-04-03  本文已影响0人  得力小泡泡

1、整数划分

算法1

完全背包求方案数问题


image.png

时间复杂度

Java 代码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int N = 1010;
    static int[] f = new int[N];
    static int mod = 1000000000 + 9;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int T = scan.nextInt();
        while(T -- > 0)
        {
            int n = scan.nextInt();
            Arrays.fill(f, 0);
            f[0] = 1;
            for(int i = 1;i <= n;i ++)
            {
                for(int j = i;j <= n;j ++)
                    f[j] = (f[j] + f[j - i]) % mod;
            }
            System.out.println(f[n]);
        }
        
    }
}

算法2

image.png

时间复杂度

Java 代码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int N = 1010;
    static int[][] f = new int[N][N];
    static int mod = 1000000000 + 9;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int T = scan.nextInt();
        while(T -- > 0)
        {
            int n = scan.nextInt();
            for(int i = 0;i <= n;i ++) Arrays.fill(f[i], 0);
            f[1][1] = 1;
            for(int i = 2;i <= n;i ++)
            {
                for(int j = 1;j <= i;j ++)
                {
                    f[i][j] = (f[i - 1][j - 1] + f[i - j][j]) % mod;
                }
            }
            int ans = 0;
            for(int i = 1;i <= n;i ++)  ans = (ans + f[n][i]) % mod;
            System.out.println(ans);
        }
        
    }
}

2、猫狗大战

3、货币系统

算法分析

若两个货币系统等价,有如下性质

步骤
由于数据中不存在负数,将a[]数组从小到大排序

时间复杂度 O(nm)

Java 代码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int N = 110,M = 25010;
    static boolean[] f = new boolean[M];
    static int[] a = new int[N];
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int T = scan.nextInt();
        while(T -- > 0)
        {
            int n = scan.nextInt();
            for(int i = 0;i < n;i ++) a[i] = scan.nextInt();
            Arrays.fill(f, false);
            Arrays.sort(a,0,n);
            f[0] = true;
            int res = 0,m = a[n - 1];
            for(int i = 0;i < n;i ++)
            {
                if(!f[a[i]]) res ++;
                for(int j = a[i];j <= m;j ++)
                {
                    f[j] |= f[j - a[i]];
                }
            }
            System.out.println(res);
        }
        
    }
}
上一篇 下一篇

猜你喜欢

热点阅读