数据结构课程设计 关键路径

关键路径(完整实例及C语言完整代码实现) 写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。 目录: 1. 2. 3.  &n. 阅读详情

问题描述

关键路径

通常把计划、施工过程、生产流程、程序流程等都当成一个工程。工程通常分为若干个称为“活动”的子工程。完成了这些“活动”,这个工程就可以完成了。通常用AOE-网来表示工程。AOE-网是一个带权的有向无环图,其中,顶点表示事件(EVENT),弧表示活动,权表示活动持续的时间。

AOE-网可以用来估算工程的完成时间。可以使人们了解:

(1)研究某个工程至少需要多少时间?

(2)哪些活动是影响工程进度的关键?

由于AOE-网中的有些活动可以并行进行,从开始点到各个顶点,以致从开始点到完成点的有向路径可能不止一条,这些路径的长度也可能不同。完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。因此,完成工程所需的最短时间是从开始点到完成点的最长路径的长度,即在这条路径上的所有活动的持续时间之和.这条路径长度就叫做关键路径(Critical Path)。

程序执行结束后应该输出:

关键活动为a1,a4,a7,a10,a8,a11

关键路径为: a1->a4->a7->a10(或者V1->V2->V5->V7->V9)和a1->a4->a8->a11(或者V1->V2->V5->V8->V9)

花费的时间为至少为18(时间单位)。

算法设计

拓扑排序的求解关键在于首先应该判断该无向图是否存在环,若不存在,则利用栈的操作,需要没有前驱的顶点选中并输出,然后删除该顶点和所有以他为尾的弧,之后再重复上述两步,直到全部的顶点均已输出。同时在计算出事件的最早发生时间。再将拓扑排序的逆序事件存入到另一个栈中。

在拓扑排序的基础上再进行关键路径的求解。主要通过计算各个活动结点的最早发生时间和最晚发生时间。若某个活动的最早和最晚发生时间相等则说明这是关键活动,由关键活动及其之间的关系组成的从原点到汇点的路径即为关键路径,一个工程不止一条关键路径。同时在根据拓扑排序的逆序计算出事件的最晚发生时间。

在实现该算法的过程中首先定义事件类和活动类,分别赋予它们不同的成员变量和成员方法,在关键路径类中实现其余算法。

 AOE网的构造过程中,使用邻接矩阵存储AOE网中的关系和权值。在关键路径方法中实现计算活动的最早发生时间和最晚发生时间。将两者相等的活动放入一个数组中,利用DFS算法回溯,在遍历以前将关键路径用标记过的活动,在该标记为0时则为关键结点,然后遍历此节点进入递归。之后进入下一个结点,遇见终点就先遍历并输出栈中的元素,即栈中的元素知道分叉点,退回上一次分岔点,然后递归进入下一条路,直到遍历结束输出关键路径。

源码如下

//结点类
public class Event {

    private String name;//节点的名字
    private int in; //入度
    private int data;//储存顶点数组的下标
    private Activity ActOE;//边上的活动

    public int getIn() {
        return in;
    }

    public int getData() {
        return data;
    }

    public Activity getActOE() {
        return ActOE;
    }

    public String getName() {
        return name;
    }

    public void setIn(int in) {
        this.in = in;
    }

    public void setData(int data) {
        this.data = data;
    }

    public void setActOE(Activity next) {
        this.ActOE = next;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Event(int data, Activity ActOE, String name) {

        this.data = data;
        this.ActOE = ActOE;
        this.name = name;
    }

    public Event() {

    }

}
public class CriticalPath {

    private Event[] vexList;//节点数组
    private int etv[], ltv[];//etv 事件最早发生时间(即顶点) ltv 事件最晚发生时间

    //拓扑排序所用到的栈
    private final Stack<Event> NodeStack = new Stack<>();
    private final Stack<Event> NodeStack1 = new Stack<>();

    //标明关键路径的关键节点
    static int MAX_VERTEXNUM = 100;
    static int[] visited = new int[MAX_VERTEXNUM];

    //关键路径用到的栈,数据结构.数组
    private final Stack<Activity> activityStack = new Stack<>();
    private static int finall;

    //使用键盘输入来构建图构建图
    public void CreateGraphByYou() {
        Event pl1 = new Event();
        Activity pl = new Activity();
        int n;
        Scanner in = new Scanner(System.in);
        System.out.println("请输入共有多少个节点:");
        n = in.nextInt();
        vexList = new Event[n];
            for (int i = 0; i < n; i++) {
                int p;//构建节点
                System.out.println("节点" + (i + 1) + " 节点存在数组中的位置 " + "节点名字");
                Event v = new Event(in.nextInt(), null, in.nextLine());
                pl1 = v;
                pl = v.getActOE();
                System.out.println("请输入此节点后有多少个边:");
                p = in.nextInt();
                for (int j = 0; j < p; j++) {
                    //构建活动即事件
                    System.out.println("边" + (j + 1) + " 弧头位置 " + "弧尾位置 " + "权值 " + "活动的名字");
                    Activity a = new Activity(in.nextInt(), in.nextInt(), in.nextInt(), null, in.next(), false);
                    if (j == 0) {
                        pl1.setActOE(a);
                        pl = pl1.getActOE();
                    } else {
                        pl.setNext(a);
                        pl = pl.getNext();
                    }
                }
                vexList[i] = v;
            }
    }

    //构建一个默认图
    public void CreateGraphByMe() {
        //所有节点即事件
        Event v1 = new Event(0, null, "v1");
        Event v2 = new Event(1, null, "v2");
        Event v3 = new Event(2, null, "v3");
        Event v4 = new Event(3, null, "v4");
        Event v5 = new Event(4, null, "v5");
        Event v6 = new Event(5, null, "v6");
        Event v7 = new Event(6, null, "v7");
        Event v8 = new Event(7, null, "v8");
        Event v9 = new Event(8, null, "v9");

        //v1节点 a1活动,a2活动,a3活动
        Activity a1 = new Activity(0, 1, 6, null, "a1", false);
        Activity a2 = new Activity(0, 2, 4, null, "a2", false);
        Activity a3 = new Activity(0, 3, 5, null, "a3", false);
        v1.setActOE(a1);
        a1.setNext(a2);
        a2.setNext(a3);

        //v2节点 a4活动
        Activity a4 = new Activity(1, 4, 1, null, "a4", false);
        v2.setActOE(a4);

        //v3节点 a5活动
        Activity a5 = new Activity(2, 4, 1, null, "a5", false);
        v3.setActOE(a5);

        //v4节点 a6活动
        Activity a6 = new Activity(3, 5, 2, null, "a6", false);
        v4.setActOE(a6);

        //v5节点 a7活动 a8活动
        Activity a7 = new Activity(4, 6, 9, null, "a7", false);
        Activity a8 = new Activity(4, 7, 7, null, "a8", false);
        v5.setActOE(a7);
        a7.setNext(a8);

        //v6节点 a9活动
        Activity a9 = new Activity(5, 7, 4, null, "a9", false);
        v6.setActOE(a9);

        //v7节点 a10活动
        Activity a10 = new Activity(6, 8, 2, null, "a10", false);
        v7.setActOE(a10);

        //v8节点 a11活动
        Activity a11 = new Activity(7, 8, 4, null, "a11", false);
        v8.setActOE(a11);

        //对象数组:vexList,保存节点构建了图
        vexList = new Event[9];
        vexList[0] = v1;
        vexList[1] = v2;
        vexList[2] = v3;
        vexList[3] = v4;
        vexList[4] = v5;
        vexList[5] = v6;
        vexList[6] = v7;
        vexList[7] = v8;
        vexList[8] = v9;
    }

    //拓扑排序
    public boolean topologicalSort() {
        //计算入度:初始化所有节点的入度
        for (Event node : vexList) {
            node.setIn(0);
        }
        //遍历每个节点后面的路径,然后就给弧尾顶点加一
        for (Event node : vexList) {
            Activity p = new Activity();
            p = node.getActOE();
            while (p != null) {
                Event Event = new Event();
                Event = vexList[p.getIndex()];
                Event.setIn(Event.getIn() + 1);
                p = p.getNext();
            }
        }

        int count = 0;
        Event p = new Event();
        Activity p1 = new Activity();
        System.out.println("拓扑排序:");

        //对事件最早发生时间数组初始化
        etv = new int[vexList.length];
        Arrays.fill(etv, 0);
        //将度为0结点的入栈
        for (Event Event : vexList) {
            if (Event.getIn() == 0) {
                NodeStack.push(Event);
            }
        }

        //遍历领接表里面边结点
        while (!NodeStack.empty()) {
            p = NodeStack.pop();
            count++;
            // 拓扑排序的逆序加入栈2中
            NodeStack1.push(p);
            System.out.print(p.getName() + " ");
            if (p.getActOE() != null) {
                p1 = p.getActOE();
            }

            //顶点最早发生时间
            //遍历到入度就减一
            while (p1 != null) {
                vexList[p1.getIndex()].setIn(vexList[p1.getIndex()].getIn() - 1);
                if (vexList[p1.getIndex()].getIn() == 0) {
                    NodeStack.push(vexList[p1.getIndex()]);
                }
                if (etv[p.getData()] + p1.getWight() > etv[p1.getIndex()]) {
                    etv[p1.getIndex()] = etv[p.getData()] + p1.getWight();
                }
                p1 = p1.getNext();
            }
        }

        //计数等于结点数就无环
        if (count != vexList.length) {
            System.out.println();
            System.out.println("图有环");
            return true;
        } else {
            System.out.println();
            System.out.println("图无环");
        }
        return false;
    }

    //关键路径
    public void criticalPath() {
        // 活动的最早发生时间 et 活动发生的最晚时间 lt p 指针扫描事件节点 pa 扫描活动节点
        int et, lt;
        Event p = new Event();
        Activity pa = new Activity();

        if (topologicalSort()) {
            return;
        }

        finall = NodeStack1.peek().getData();
        ltv = new int[vexList.length];
        for (int i = 0; i < vexList.length; i++) {
            ltv[i] = etv[finall];
        }

        //事件最晚发生时间
        while (!NodeStack1.empty()) {
            p = NodeStack1.pop();
            if (p.getActOE() != null) {
                pa = p.getActOE();
            }
            while (pa != null) {
                if (ltv[pa.getIndex()] - pa.getWight() < ltv[p.getData()]) {
                    ltv[p.getData()] = ltv[pa.getIndex()] - pa.getWight();
                }
                pa = pa.getNext();
            }
        }
        Arrays.fill(visited, 1);

        System.out.print("关键活动为:");

        //求et,lt和关键路径
        for (int i = 0; i < vexList.length; i++) {
            Activity pn = new Activity();
            pn = vexList[i].getActOE();
            while (pn != null) {
                et = etv[i];
                lt = ltv[pn.getIndex()] - pn.getWight();
                if (et == lt) {
                    visited[vexList[i].getData()] = 0;
                    System.out.print(pn.getName() + " ");
                }
                pn = pn.getNext();
            }
        }

        System.out.println();
        System.out.println("花费时间至少为:" + ltv[finall]);
        System.out.println();
    }

    //输出每条关键路径
    public void DFS(int k) {
        visited[k] = 1;
        Activity p = new Activity();
        p = vexList[k].getActOE();

        //终点
        visited[finall] = 0;

        if (k == finall) {
            for (Activity activity : activityStack) {
                System.out.print(activity.getName() + "->");
            }
        }

        // 遍历节点后面的链表
        while (p != null) {
            if (visited[p.getIndex()] != 1) {
                //是关键路径就入栈
                activityStack.push(p);
                DFS(p.getIndex());
                //遇见死路回退的时候出栈
                activityStack.pop();
            }
            System.out.println();
            p = p.getNext();
        }
    }

    public static void main(String[] args) {
        CriticalPath a=new CriticalPath();
        a.CreateGraphByMe();
        //a.CreateGraphByYou();
        a.criticalPath();
        a.DFS(0);
    }
}
//活动类
public class Activity {

    private int index;//存储该顶点对应的下标
    private int wight;//权值
    private int head;//弧头
    private Activity next;//弧尾
    private String name;//活动的名字
    private boolean mark; //标识位:标识有没有遍历过

    public boolean isMark() {
        return mark;
    }

    public void setMark(boolean mark) {
        this.mark = mark;
    }

    public int getHead() {
        return head;
    }

    public void setHead(int head) {
        this.head = head;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Activity(int head, int index, int wight, Activity next, String name, boolean mark) {
        this.index = index;
        this.wight = wight;
        this.next = next;
        this.name=name;
        this.mark=mark;
        this.head=head;
    }

    public Activity() {

    }

    public int getIndex() {
        return index;
    }

    public void SetIndex(int index) {
        this.index = index;
    }

    public int getWight() {
        return wight;
    }

    public void SetWight(int wight) {
        this.wight = wight;
    }

    public Activity getNext() {
        return next;
    }

    public void setNext(Activity next) {
        this.next = next;
    }
}

【swjtu】数据结构实验课程设计_图的关键路径 报告目录 1. 课程设计内容与要求(P2) 2. 程序设计报告 2.1 总体设计(P2-P3) 2.2 详细数据结构设计(P3) 2.3 详细算法设计(P3-P5) 3. 程序测试报告(P5) 4. 结论(P5) 5. 源程序附录(P5-P10) 课程设计内容与要求: 用字符文件提供数据建立AOE网络邻接表存储结构,编写程序,输出一条关键路径以及工程的最短完成时间。输出的关键路径用该路径上全部顶点的拓序有序序列表示。 实验目的: 掌握图的邻接表存储... 阅读详情

相关推荐

关键路径数据结构课程设计

有关路径的代码,以及前面的内容,都是自己写的,全套的,需要的可以参考一下

【数据结构课程设计】关键路径问题

1) 任务:设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动。 2)基本要求: (1)对一个描述工程的 AOE 网,应判断其是否能够顺利进行。 (2)若该工程能顺利进行,输出完成整项工程至少需要多少时间,以及每一个关键活动所依附的两个顶点、最早发生时间、最迟发生时间。

鲑鱼弥勒的博客 3741

数据结构课程设计(求关键路径)

数据结构课程设计,求拓扑排序和关键路径,有源程序。

数据结构课程设计(十一)---关键路径问题

1、任务简述: 设计实现AOE网的关键活动与关键路径问题 要求: (1)自行建立图的数据文件,以邻接表或者邻接矩阵表示图皆可,显示输出原图(按照邻接表的样式); (2)计算出各个事件的最早发生时间与最迟发生时间,并显示输出; (3)输出所有的关键路径。 2、算法描述: 数据结构: typedef struct arc { int index; //编号 float weight; //权重 struct arc *next; //指向下一个节点 }AR; typedef struct MyGraph { i

zhulinhao的博客 6522

(数据结构课程设计)关键路径.rar

(数据结构课程设计)关键路径c++源代码,课程设计报告齐全。

【操作系统】 Operation System 第二章:操作系统基础操作

2.1 操作系统的启动 (1)CPU, I/O, 内存通过总线连接。 (2)DISK:存放OS; BIOS:基本I/O处理系统( basic I/O system); Bootloader: 加载OS到内存中。 (3)当电脑通电时,段寄存器CS和指令寄存器IP能够确定一个内存地址,例如CS:IP = 0xf000:fff0. (4)POST(加电自检),寻找显卡和执行BIOS。(显示器,键盘…是否...

iwanderu的博客 1万+

2024-12-23【数据结构课程设计】【关键路径】

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

2401_83915450的博客 1110

【实战指南】OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

hampeter的博客 1799

【数据关联(26)】数据关联技术方向

联合概率数据关联(Joint Probabilistic Data Association,JPDA) 联合概率数据互联JPDA是数据关联算法之一,它的基本思想是:对应于观测数据落入跟踪门相交区域的情况,这些观测数据可能来源于多个目标。JPDA的目的在于计算观测数据与每一个目标之间的关联概率,且认为所有的有效回波都可能源于每个特定目标,只是它们源于不同目标的概率不同。JPDA算法的优点在于...

AbiUni(YY熊) 3546

fNIRS 公开数据集整理

关注“心仪脑”查看更多脑科学知识的分享。 关键词:数据整理、fNIRS 之前我们向大家推送了 Public Neuroscience Dataset 系列主题的第一期:《EEG公开数据集》,我们同时意识到大家对于神经科学公开数据集的需求。本期是该系列主题的第二期,我们在延续第一期初衷的基础上,整理了功能性近红外光谱(fNIRS)技术的公开数据集。 fNIRS 是一种非侵入性、便携且价格低廉的光学神经成像技术,它具有可观的空间和时间分辨率。因fNIRS技术问世较EEG晚了许多,所以应用此技术开展研究发.

psybrain的博客 4271

几款常见存储系统的对比分析

如何对比选择存储系统?本文给你答案!本文将详细对比NetApp、Lsilon、Vast Data、DDN lustre和WekaFS的五个存储系统的简单性、速度、规模及标准。

hongcloudtech的博客 1678

2021-12-23【数据结构课程设计】【关键路径】

if (!return 1;if (!Status Pop(SqStack &S, SElemType &e){ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */return OK;//e[]:最早发生时间 vl[]:最迟发生时间。

2401_85125383的博客 677

全志V3S开发板实战:从零构建嵌入式Linux系统

本文提供了一份针对全志V3S开发板(如LicheePi Zero)的零基础教程,详细指导如何从零开始构建嵌入式Linux系统。内容涵盖编译环境搭建、交叉工具链配置、U-Boot引导程序编译与烧录、Linux内核定制与编译,以及使用Buildroot构建根文件系统,最终实现系统成功启动,帮助开发者深入理解嵌入式系统构建全流程。

tensor9flow的博客 574

数据结构课程设计 拓扑排序+关键路径+可视化界面

拓扑排序+关键路径+可视化界面

2301_80389709的博客 407

Markdown编辑器介绍

这篇文章介绍了Markdown编辑器的功能和使用方法。主要内容包括:Markdown的基本语法如标题、列表、链接插入等;新增功能如图片拖拽、数学公式支持、甘特图和UML图表绘制;常用快捷键说明;以及文本导出导入操作。文章详细说明了如何通过Markdown语法实现文本格式化、代码高亮、表格创建等功能,并提供了多种图表绘制的语法示例,帮助用户更好地利用Markdown编辑器进行写作和内容创作。

soso1968的博客 1178

爆改YOLOv8 | PSA注意力机制融合入YOLOv8

yolov8,PSA注意力,即插即用

weixin_43986124的博客 2496

2021-12-23【数据结构课程设计】【关键路径】,2024年最新2024最后一次Java面试

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。下面有部分截图希望能对大家有所帮助。i < n - 1;i++)

2401_85405690的博客 855

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

数据结构课程设计/校园导游程序及通信线路设计 #3

本文章将根据编者的,讲解关于最短路径,最小生成树,关键路径等内容,涉及邻接矩阵和邻接表存储图结构;prim算法;djstl迪杰斯特拉算法;关键路径AOE网;程序设计相关内容。

2401_87092242的博客 520

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

9 数据结构课程设计小组任务9:获取AOE网的关键路径

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #include <string> #include <vector> #include <queue> #include <sstream> #include .

windyuan~ 557

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

数据结构课程设计/校园导游程序及通信线路设计 #0

本文章将根据编者的数据结构课程设计,讲解关于最短路径,最小生成树,关键路径等内容,涉及邻接矩阵和邻接表存储图结构;prim算法;djstl迪杰斯特拉算法;关键路径AOE网;程序设计相关内容。设计校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。按照从北向南的顺序建设学校的景点,请输出完成北门建设的最短工期,并输出关键路径。现在,跟着编者的思路,来看看我是怎么完成这个课程设计的吧。

2401_87092242的博客 1072

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据结构课程设计/校园导游程序及通信线路设计 #2

本文章将根据编者的,讲解关于最短路径,最小生成树,关键路径等内容,涉及邻接矩阵和邻接表存储图结构;prim算法;djstl迪杰斯特拉算法;关键路径AOE网;程序设计相关内容。

2401_87092242的博客 446
上一篇: 数据结构实验哈夫曼编码
下一篇: 算法课设之迷宫求解问题
java洲
博客等级 码龄6年 5粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值