比赛 |
寒假归来,刮刮油 |
评测结果 |
EEEEEEEEEE |
题目名称 |
金明的预算方案 |
最终得分 |
0 |
用户昵称 |
ミント |
运行时间 |
1.273 s |
代码语言 |
C++ |
内存使用 |
8.88 MiB |
提交时间 |
2016-02-25 21:05:35 |
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("budget.in");
ofstream fout("budget.out");
const int Maxn = 32000 + 100;
const int Maxm = 60 + 10;
vector<int> Tree[Maxm];
vector<int> Tree_Prime;
int Fun[Maxm][Maxn];
int Tree_Worth[Maxm];
int N, M, S, P;
class poi
{
public:
int u, v;
}W[Maxm];
void Init()
{
memset(Tree_Worth, 0, sizeof(Tree_Worth));
memset(Fun, 0, sizeof(Fun));
return ;
}
void Read()
{
fin>>N>>M>>S;
for(int i=1;i<=M;i++)
{
fin>>W[i].u>>W[i].v;
fin>>P;
W[i].v *= W[i].u;
Tree[P].push_back(i);
}
return ;
}
void DFS(int Root)
{
Tree_Worth[Root] = 1;
for(int i=0;i<Tree[Root].size();i++)
{
Tree_Prime.push_back(Tree[Root][i]);
DFS(Tree[Root][i]);
Tree_Worth[Root] += Tree_Worth[Tree[Root][i]];
}
return ;
}
int main()
{
Init();
Read();
DFS(0);
for(int i=M-1;i>=0;i--)
{
int Now = Tree_Prime[i];
for(int j=N;j>=W[Now].u;j--)
Fun[i][j] = max(Fun[i+1][j-W[Now].u]+W[Now].v, Fun[i+Tree_Worth[Now]][j]);
for(int j=W[Now-1].u;j>0;j--)
Fun[i][j] = Fun[i+Tree_Worth[Now]][j];
}
fout<<Fun[0][N]<<endl;
fin.close();
fout.close();
return 0;
}