九度 1494:Dota(完全背包)
2024-08-28 13:46:16
大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素。
英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备。
为了简化问题,我们将每个装备对于英雄的功能抽象为一个整数:价值。同时,如上所说,一些特定的装备可以用来合成更强的装备,玩家会因此获得除原装备价值外额外的价值。
给定玩家现有的金钱数,每个装备的价格和其对应的价值,以及装备合成的信息。输出,其能获得的最大价值数。
注意:每件装备只能参与合成一件合成装备(即原装备参与合成后得到合成后的新装备,原装备消失),除非一次购买多个该种装备。
思路
1. 刚开始没看懂题目, 还以为是有依赖的背包问题, 后来看了解题报告才明白过来: 装备是没有购买上限的, 这就简单多了
2. 假如给定的装备只能取一件, 装备之间又能合成新装备, 那么这道题就难了
代码
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std; int weight[];
int value[]; int dp[];
int n, m, g; int main() { while(scanf("%d%d%d", &n, &m, &g) != EOF) {
memset(weight, , sizeof(weight));
memset(value, , sizeof(value));
memset(dp, , sizeof(dp)); for(int i = ; i < n; i ++) {
scanf("%d%d", weight+i, value+i);
} for(int i = ; i < m; i ++) {
int q;
scanf("%d", &q);
for(int k = ; k < q; k ++) {
int party;
scanf("%d", &party);
weight[n] += weight[party-];
value[n] += value[party-];
} int extraValue;
scanf("%d", &extraValue);
value[n] += extraValue;
n++;
} for(int i = ; i < n; i ++) {
for(int v = weight[i]; v <= g; v ++) {
dp[v] = max(dp[v], dp[v-weight[i]]+value[i]);
}
} printf("%d\n", dp[g]); }
return ;
}
最新文章
- laravel的门面模式
- DOM--2 创建可重用的对象
- python——初识socket
- 关于创建可执行的jar文件(assembly)
- Python漫谈-比较运算符和类的神奇方法
- 《Web编程入门经典》
- pthread_create()之前的属性设置
- C#中异步和多线程的区别
- $stop and $finish in verilog
- Android利用Filter过滤数据
- JAVA命令参数详解
- (算法入门经典大赛 优先级队列)LA 3135(之前K说明)
- 【扩展欧几里得】NOIP2012同余方程
- 用python3读CSV文件,出现UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0xd0 in position 0: invalid con
- python Twisted安装报错
- learning ddr reset initialization with stable power
- Django下的templates 和 static静态文件
- 2018.10.27 bzoj3209: 花神的数论题(数位dp)
- zabbix 对网卡的流量的监控
- POJ 2586 Y2K Accounting Bug 贪心 难度:2