bzoj2427 软件安装

Description

现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi。我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大)。
但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作(软件i依赖软件j)。幸运的是,一个软件最多依赖另外一个软件。如果一个软件不能正常工作,那么它能够发挥的作用为0。
我们现在知道了软件之间的依赖关系:软件i依赖软件Di。现在请你设计出一种方案,安装价值尽量大的软件。一个软件只能被安装一次,如果一个软件没有依赖则Di=0,这时只要这个软件安装了,它就能正常工作。

Input

第1行:N, M  (0<=N<=100, 0<=M<=500)       第2行:W1, W2, ... Wi, ..., Wn (0<=Wi<=M )       第3行:V1, V2, ..., Vi, ..., Vn  (0<=Vi<=1000 )       第4行:D1, D2, ..., Di, ..., Dn(0<=Di<=N, Di≠i )

Output

一个整数,代表最大价值。

软件之间的关系构成树或环,暴力把环缩成一点然后就是树形背包了。

#include<cstdio>
#include<vector>
std::vector<int> ss[128];
int pa[128];
int id[128];
int w[128],v[128],fa;
int n,m;
int f[128][512];
int g[128][512];
void maxs(int&a,int b){
    if(a<b)a=b;
}
int t=0;
void dfs(int x){
    int sz=ss[x].size();
    if(sz){
        for(int i=0;i<sz;i++)dfs(ss[x][i]);
        int u=ss[x][0];
        for(int j=m;j>=0;j--)g[x][j]=f[u][j];
        for(int i=1;i<sz;i++){
            u=ss[x][i];
            for(int j=m;j>=0;j--)
            for(int k=0;k<=j;k++)
            maxs(g[x][j],g[x][j-k]+f[u][k]);
        }
        for(int j=w[x];j<=m;j++)
        f[x][j]=g[x][j-w[x]]+v[x];
    }else{
        for(int i=w[x];i<=m;i++)f[x][i]=v[x];
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",w+i);
    }
    for(int i=1;i<=n;i++){
        scanf("%d",v+i);
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&fa);
        if(i!=fa)pa[i]=fa;
        id[i]=i;
    }
    for(int i=1;i<=n;i++){
        int a=i;
        if(~pa[i])
        for(int j=1;j<=110;j++){
            a=pa[a];
            if(a<1)break;
            if(a==i){
                for(a=pa[a];a!=i&&~a;a=fa){
                    v[i]+=v[a];
                    w[i]+=w[a];
                    fa=pa[a];
                    pa[a]=-1;
                    id[a]=i;
                }
                pa[i]=0;
                break;
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(~pa[i])ss[id[pa[i]]].push_back(i);
    }
    dfs(0);
    printf("%d",f[0][m]);
    return 0;
}
时间: 2024-10-14 08:05:34

bzoj2427 软件安装的相关文章

[HAOI2010][BZOJ2427] 软件安装|tarjan|树型dp

2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 463  Solved: 194[Submit][Status][Discuss] Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(

BZOJ2427: [HAOI2010]软件安装

2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1512  Solved: 584[Submit][Status][Discuss] Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j

【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包

[BZOJ2427][HAOI2010]软件安装 Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作(软件i依赖软件j).幸运的是,一个软件最多依赖另外一个软件.如果一个软件不能正常工作,那么它能够发挥的作用为0.我们现在知道

【BZOJ-2427】软件安装 Tarjan + 树形01背包

2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 960  Solved: 380[Submit][Status][Discuss] Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(包

Linux光盘yum源软件安装

关于Linux中的软件安装,有三种方法,个人认为比较方便的就是yum安装,有网的话比较简单,暂且不提.本文主要记录在没有外网的情况下,如何以本地光盘搭建yum源来实现yum安装. 主要包括以下几步: 1.装入本地光盘 2.修改yum配置文件 进入到 /etc/yum.repos.d目录下,可以看到这里有四个yum配置文件:CentOS-Base.repo为默认的yum源,而且是网络yum源.CentOS-Media.repo为光盘yum源. <1>.使用光盘的话要是网络yum源失效. 这里直接

Linux 软件安装 &nbsp; 运维

软件安装 RPM  YUM  编译安装 ================================================================= 常见的软件包的格式:*.rpm /*.tar /*.tar.gz/*.tar.bz2/*.py/*.bin/*.bundle ================================================================= RPM (关于rpm命令详解见博文Command) ---------

CentOS下软件安装方法总结

一.rpm包安装方式步骤:1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录:2.打开一个终端,su -成root用户:3.cd soft.version.rpm所在的目录:4.输入rpm -ivh soft.version.rpm二.deb包安装方式步骤:1.找到相应的软件包,比如soft.version.deb,下载到本机某个目录:2.打开一个终端,su -成root用户:3.cd soft.version.deb所在的目录:4.输入dpkg -i soft.ve

Linux软件安装

软件安装方式: 1. rpm方式 该方式软件安装本质与Windows下安装软件方式一致,就是把软件包里面的二进制代码文件复制到系统指定目录(如 C://program files) 优点:软件安装非常方便 缺点:软件的个个组成部分比较固定,不灵活,需要手动解决依赖关系; 2.yum智能方式 该方式类似360的"一键安装",较智能. 该方式条件:1>可以上网 or 通过配置把软件放到指定位置(不联网的情况下) 好处:方便 一键安装,无需考虑软件依赖 3.源码编译安装 源码文件---

centos的软件安装方法rpm和yum

centos的软件安装大致可以分为两种类型: [centos]rpm文件安装,使用rpm指令  类似[ubuntu]deb文件安装,使用dpkg指令 [centos]yum安装   类似[ubuntu]apt-get安装 rpm命令 (一)查询系统装已经安装的软件信息 对于一个rpm包来说,都是有"-"和"."构成的,基本上有以下几部分组成: * 包名 * 版本信息 * 发布版本号 * 运行平台,当出现noarch,代表的是软件可以平台兼容 1)查询系统中已经安装的