博客
关于我
蓝桥杯AcWing学习笔记 9-2复杂DP的学习(下)
阅读量:796 次
发布时间:2023-03-25

本文共 1393 字,大约阅读时间需要 4 分钟。

完全背包问题的解决方案如下:

问题分析

我们需要找出在给定N个物品的情况下,总体积不超过M的数目中,无法被组合出来的数目。每个物品有特定的体积和价值。通过分析,我们可以使用动态规划来解决这个问题。

方法思路

  • 计算最大公约数:首先计算所有物品的最大公约数d。如果d > 1,则无法组合的数目为无限多个(因为这些数都是d的倍数),直接输出“INF”。
  • 动态规划:使用一个布尔数组dp,其中dp[j]表示是否可以用前i个物品组成总和j。对于每个物品,更新dp数组,从后向前处理,避免重复计算。
  • 统计无法组合的数目:遍历dp数组,统计无法被组合的总和数目。
  • 解决代码

    import java.util.Scanner;
    public class Main {
    static final int N = 110, M = 10010;
    static int[] a = new int[N];
    static boolean[] f = new boolean[M];
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int d = 0;
    for (int i = 1; i <= n; i++) {
    a[i] = sc.nextInt();
    d = gcd(d, a[i]);
    }
    if (d != 1) {
    System.out.println("INF");
    return;
    }
    f[0] = true;
    for (int i = 1; i <= n; i++) {
    for (int j = a[i]; j < M; j++) {
    f[j] |= f[j - a[i]];
    }
    }
    int res = 0;
    for (int j = 0; j < M; j++) {
    if (!f[j]) {
    res++;
    }
    }
    System.out.println(res);
    }
    private static int gcd(int a, int b) {
    return b != 0 ? gcd(b, a % b) : a;
    }
    }

    代码解释

  • 输入处理:读取输入数据,计算所有物品的最大公约数d。
  • 最大公约数检查:如果d != 1,输出“INF”。
  • 动态规划初始化:初始化布尔数组f,表示总和j是否可以被组合出来。
  • 更新dp数组:从后向前更新dp数组,确保每个状态只被处理一次。
  • 统计结果:遍历dp数组,统计无法被组合的数目并输出。
  • 这种方法确保了在给定约束条件下,正确高效地解决完全背包问题。

    转载地址:http://lzhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现抽象工厂模式(附完整源码)
    查看>>
    Objective-C实现拉格朗日插值法(附完整源码)
    查看>>
    Objective-C实现拷贝二进制文件(附完整源码)
    查看>>
    Objective-C实现指定内存空间获取时间的函数(附完整源码)
    查看>>
    Objective-C实现按位倒序(附完整源码)
    查看>>
    Objective-C实现按位运算符乘以无符号数multiplyUnsigned算法(附完整源码)
    查看>>
    Objective-C实现排队叫号系统(附完整源码)
    查看>>
    Objective-C实现控制NRP8S功率计读取功率 (附完整源码)
    查看>>
    Objective-C实现控制程控电源2306读取电流 (附完整源码)
    查看>>
    Objective-C实现摄氏温度和华氏温度互转(附完整源码)
    查看>>
    Objective-C实现播放器(附完整源码)
    查看>>
    Objective-C实现操作MySQL(附完整源码)
    查看>>
    Objective-C实现操作注册表 (附完整源码)
    查看>>
    Objective-C实现改变图片亮度算法(附完整源码)
    查看>>
    Objective-C实现数字图像处理算法(附完整源码)
    查看>>
    Objective-C实现数组切片(附完整源码)
    查看>>
    Objective-C实现数组去重(附完整源码)
    查看>>
    Objective-C实现数组的循环左移(附完整源码)
    查看>>
    Objective-C实现数除以二divideByTwo算法(附完整源码)
    查看>>
    Objective-C实现文件分割(附完整源码)
    查看>>