[HAOI2010] 软件安装

该博客讨论了HAOI2010中的一道题目,涉及如何在有限磁盘空间内选择价值最大的软件,同时考虑软件间的依赖关系。通过分析输入输出格式和样例数据,博主提出将问题转化为树形背包问题,但指出由于软件的双向依赖,需要使用Tarjan缩点算法来优化解决方案。然而,实现过程中遇到了困难,进入了调试循环。
摘要由CSDN通过智能技术生成

题目描述

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


输入格式

第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 )


输出格式

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


样例数据

样例输入

3 10
5 5 6
2 3 4
0 1 1

样例输出

5


题目分析

根据题意,很容易想到金明的预算方案这道题,然后你就跪了,软件可以无限制地向上依赖,并不是主附件关系。
然后你就想到了树形背包,然后就得了40分(我就是这样的),因为软件可以互相依赖,A依赖B,B依赖A,要么全部选,要么全部不选,因此可以进行Tarjan缩点。
然后就陷入无限调试状态。
再见


源代码

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
inline const int Get_Int() {
    int num=0,bj=1;
    char x=getchar();
    while(x<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值