美文网首页
第24章 背包问题进阶

第24章 背包问题进阶

作者: 得力小泡泡 | 来源:发表于2020-04-03 15:54 被阅读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、货币系统

算法分析

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

  • 性质1:a1,a2,...,an一定都可以被表示出来
  • 性质2:在最优解中,b1,b2,...bm一定都是从a1,a2,...,an中选择的
  • 性质3:b1,b2,...,bm一定不能被其他bi表示出来

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

  • (1)若ai能被a0~a(i-1)表示出来,则一定不选
  • (2)若ai不能被能被a0~a(i-1)表示出来,则一定选

时间复杂度 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);
        }
        
    }
}

相关文章

  • 第24章 背包问题进阶

    1、整数划分 算法1 完全背包求方案数问题 时间复杂度 Java 代码 算法2 时间复杂度 Java 代码 2、猫...

  • 2022-02-19 动态规划高频题专题【1】

    动态规划基本类型 dp基础 背包问题 打家劫舍 股票问题 子序列问题 进阶动态规划 深入理解动态规划过程 定义dp...

  • 背包问题(完全背包)

    动态规划合集: 1.矩阵链乘法2.投资组合问题3.完全背包问题4.01背包问题5.最长公共子序列 例题3——背包问...

  • 完全背包--二维数组

    完全背包问题是在01背包问题进行些改变,其大意为:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物...

  • Algorithm进阶计划 -- 动态规划(下)

    经典动态规划背包问题最长子序列问题 1. 背包问题 1.1 0-1 背包问题 0-1 背包问题,描述如下: 上面...

  • 背包问题

    0-1背包问题 问题 n个物体,它们各自有重量和价值,给定一个有容量的背包,如何让背包里装入的物体价值总和最大? ...

  • 背包问题

    问题描述 假如有一个能装下4磅的背包,如何从下列商品列表中选择商品填充背包,使价值达到最大: 动态规划 要解决背包...

  • 背包问题

    (1)0-1背包容量为10的背包,有5种物品,每种物品只有一个,其重量分别为5,4,3,2,1,其价值分别为1,2...

  • 背包问题

  • 背包问题

    01背包(物品只有一个) 有N件物品和一个容量为V的背包。第i建物品的费用是w[i],价值是v[i]。求解将哪些物...

网友评论

      本文标题:第24章 背包问题进阶

      本文链接:https://www.haomeiwen.com/subject/hvaluhtx.html