动态规划——多重背包、分组背包

简介: 动态规划——多重背包、分组背包

多重背包


1.题目



2.思路分析


一、状态表示:f[i][j]

1. 集合:从前i个物品中选,且总体积不超过j的所有方案的集合.

2. 属性:最大值


二、状态计算:


1. 思想-----集合的划分


2. 集合划分依据:根据第i个物品有多少个来划分.含0个、含1个···含k个.


状态表示与完全背包朴素代码一样均为:


f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i]);


3.Ac代码


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    static int N=1010;
    static int n,m;
    static int []v=new int[N];   //体积
    static int []w=new int[N];   //价值
    static int []s=new int[N];   //数量
    static int [][]f=new int[N][N];  //拿了总体积不超过j的情况下的价值最大
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str[]=br.readLine().split(" ");
        n=Integer.parseInt(str[0]);
        m=Integer.parseInt(str[1]);
        for (int i = 1; i <=n; i++) {
          String st[]=br.readLine().split(" ");
          v[i]=Integer.parseInt(st[0]);
          w[i]=Integer.parseInt(st[1]);
          s[i]=Integer.parseInt(st[2]);
        }
        for (int i = 1; i <=n; i++) {
            for (int j = 0; j <=m; j++) {
                for (int k=0; k<=s[i] &&k *v[i]<=j ;k++)
                    f[i][j]=Math.max(f[i][j] ,f[i-1][j-v[i]*k]+w[i]*k);
            }
        }
        System.out.println(f[n][m]);
    }
}


4.二进制优化方法


如果将背包问题的数据范围扩大呢,那么显然刚刚的做法会超时

取这样一个例子:要求在一堆苹果选出n个苹果。我们传统的思维是一个一个地去选,选够n个苹果就停止。这样选择的次数就是n次


二进制优化思维就是:现在给出一堆苹果和10个箱子,选出n个苹果。将这一堆苹果分别按照1,2,4,8,16,.....5121,2,4,8,16,.....512分到10个箱子里,那么由于任何一个数字x∈[0,1023]x∈[0,1023] 都可以从这10个箱子里的苹果数量表示出来,但是这样选择的次数就是 ≤10次≤10次 。


比如:


如果要拿10011001次苹果,传统就是要拿10011001次;二进制的思维,就是拿7个箱子就行(分别是装有512、256、128、64、32、8、1512、256、128、64、32、8、1个苹果的这7个箱子),这样一来,1001次操作就变成7次操作就行了。


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    static int N=12010,M=2010;
    static int n,m;
    static int []v=new int[N];     //体积
    static int []w=new int[N];    //价值
    static int []f=new int[M];    //拿了总体积不超过j的情况下的价值最大
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str[]=br.readLine().split(" ");
        n=Integer.parseInt(str[0]);
        m=Integer.parseInt(str[1]);
        int cnt=0;   //分组的组别
        for (int i = 1; i <=n; i++) {
          String st[]=br.readLine().split(" ");
          int a=Integer.parseInt(st[0]);
          int b=Integer.parseInt(st[1]);
          int s=Integer.parseInt(st[2]);
          int k=1;   //每组的数量
            while (k<= s){
                cnt++;
                v[cnt]= a*k;  //整体体积
                w[cnt]= b*k;  //整体价值
                s=s- k;   //c要减少
                k=k* 2;  // 组别里的个数增加
            }
            if(s>0){
                cnt++;
                v[cnt]= a*s;
                w[cnt]= b*s;
            }
        }
        //这样就把多重背包分成多个 01背包了
        n=cnt;
        for (int i = 1; i <=n; i++) {
            for (int j = m; j >=v[i]; j--) {
              f[j]=Math.max(f[j] , f[j-v[i]]+w[i]);
            }
        }
        System.out.println(f[m]);
    }
}


分组背包


1.题目


2.思路分析


给定好多组物品,每组里有若干物品,同一组内的物品最多只能选一个。

每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。


3.Ac代码


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    static int N=110;
    static int n,m;
    static int [][]v=new int[N][N];     //体积
    static int [][]w=new int[N][N];    //价值
    static int []s=new int[N];    //数量
    static int []f=new int[N];    //拿了总体积不超过j的情况下的价值最大
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str[]=br.readLine().split(" ");
        n=Integer.parseInt(str[0]);
        m=Integer.parseInt(str[1]);
        for (int i = 1; i <=n; i++) {
            s[i]=Integer.parseInt(br.readLine());
            for (int j = 0; j < s[i]; j++) {
                String st[]=br.readLine().split(" ");
                v[i][j]=Integer.parseInt(st[0]);
                w[i][j]=Integer.parseInt(st[1]);
            }
        }
        for (int i = 1; i <=n; i++) {
            for(int j=m;j>0;j--){
             for(int k=0;k<s[i];k++){
                 if(j>=v[i][k])
                 f[j]=Math.max(f[j],f[j-v[i][k]]+w[i][k]);
             }
            }
        }
        System.out.println(f[m]);
    }
}


感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下

相关文章
|
机器学习/深度学习 索引 Windows
OFDM原理及MATLAB仿真
OFDM原理及MATLAB仿真
1442 2
|
7月前
|
机器学习/深度学习 算法 5G
OTFS调制技术:通往6G的时延-多普勒域革命
OTFS调制技术革新无线通信,将信息从时频域迁移至时延-多普勒域,利用信道的准静态特性与稀疏性,显著提升高速移动场景下的抗多普勒性能与频谱效率,成为6G关键候选技术。
1679 1
|
9月前
|
Web App开发 安全 Linux
Linux 比起其他系统的5 个优点和 5 个缺点
对Linux系统感兴趣的朋友,可以点击下方书籍进行学习。
|
8月前
|
机器学习/深度学习 算法 BI
汽车雷达系统的干扰缓解:现状调查与未来趋势——论文阅读
本文系统综述了汽车雷达干扰缓解技术的最新进展,提出基于物理域避免、主动避免、反应式信号重建和被动调制技术的四类划分方法,深入分析各类策略的原理、优劣及实施挑战,并强调跨学科合作与监管协同对未来发展的关键作用。
607 4
汽车雷达系统的干扰缓解:现状调查与未来趋势——论文阅读
|
7月前
|
机器学习/深度学习 编解码 资源调度
正交啁啾分复用雷达技术(OCDM雷达):下一代传感系统技术
正交啁啾分复用雷达(OCDM)基于Fresnel变换,通过复用正交啁啾波形实现雷达通信一体化。相较传统FMCW,其多普勒容限更高、抗干扰强3-5 dB,支持高速移动场景,适用于自动驾驶与6G,是下一代高精度传感核心技术。
1229 4
|
7月前
|
SQL 编解码 索引
正交时频空间调制(OTFS)技术详解:基础原理与未来挑战
正交时频空间(OTFS)调制将信息嵌入延迟-多普勒域,有效应对高速移动下的多普勒效应。相比OFDM,OTFS在高动态信道中具备全分集增益、低导频开销与强鲁棒性,是6G候选技术之一。
2128 0
|
7月前
|
编解码 资源调度 物联网
正交时频空间(OTFS)调制技术:理论基础与性能分析
正交时频空间(OTFS)调制技术在延迟-多普勒域进行信号设计,有效应对高多普勒、短包传输等5G挑战。相比传统OFDM,OTFS通过全时频分集和信道硬化,显著提升高速移动场景下的鲁棒性与分集增益,仿真显示其在BLER性能上可获得3-4dB SNR增益,尤其适用于车联网、物联网等应用场景。
1429 0
正交时频空间(OTFS)调制技术:理论基础与性能分析
|
7月前
|
机器学习/深度学习 算法 数据可视化
6G时代的新型延迟多普勒通信范式:正交时频空间(OTFS)综述
本文综述正交时频空间(OTFS)技术,一种面向6G高移动性场景的新型延迟-多普勒域通信范式。OTFS通过在延迟-多普勒域调制信号,克服传统OFDM在高速移动下的多普勒扩展难题,具备信道稳定性强、抗干扰能力优、峰均比低等优势。文章系统阐述OTFS的信道模型、调制原理、收发机设计、ISAC一体化及在卫星、水声、可见光等新兴场景的应用前景,为其在6G空天地海一体化网络中的应用提供理论支撑与技术路径。
1463 0
6G时代的新型延迟多普勒通信范式:正交时频空间(OTFS)综述
|
传感器 数据采集 监控
基于阿里云MQTT服务,设计一个STM32的智能光伏控制系统
这篇文章详细介绍了利用STM32F103C8T6单片机实现光伏发电系统的关键技术。全文分为四章:第一章阐述了光伏发电的背景、意义及应用场景,强调其在绿色能源领域的重要性。第二章介绍了如何通过STM32F103C8T6及光敏电阻和伺服电机实现光线追踪系统,详细描述了硬件选择、连接及使用HAL库编写的单片机程序。第三章讲解了最大功率点追踪(MPPT)的原理,并展示了如何利用STM32F103C8T6和相关传感器、DC-DC转换器实现MPPT功能。第四章描述了如何通过STM32F103C8T6与SIM7600CE 4G模块连接到阿里云MQTT服务,实现设备状态数据的远程传输和控制。本文提供了全面的硬
18461 5