九度笔记之 1494:Dota - KingEasternSun的专栏 - 博客频道 - CSDN.NET
装备是没有购买上限的, 这就简单多了
2. 假如给定的装备只能取一件, 装备之间又能合成新装备, 那么这道题就难了
完全背包,内层循环是从小到大。注意合成值也要单独得到花费和价值。
http://blog.csdn.net/wdy_yx/article/details/9815631
我们把合成的装备看作单独的一件装备,计算合成装备的价格(合成所需装备价格之和),合成装备的价值(合成所需装备价值之和 加上 额外价值)
- 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素。
英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备。
为了简化问题,我们将每个装备对于英雄的功能抽象为一个整数:价值。同时,如上所说,一些特定的装备可以用来合成更强的装备,玩家会因此获得除原装备价值外额外的价值。
给定玩家现有的金钱数,每个装备的价格和其对应的价值,以及装备合成的信息。输出,其能获得的最大价值数。
注意:每件装备只能参与合成一件合成装备(即原装备参与合成后得到合成后的新装备,原装备消失),除非一次购买多个该种装备。
- 输入:
- 输入包含多组测试数据,每组测试数据第一行为三个整数n,m,g(1<=n<=100),(0<=m<=100),(1<=g<=1000)。
分别表示存在的装备总数n,存在的装备合成关系数m,和英雄所有的金钱g。
接下去n行,每行两个整数(p,v)(1<=p<=100,1<=v<=100)分别表示该件装备的价格p,和其自身的价值v。
每组测试数据的最后为m行数据,每行由两部分组成。开头一个整数t(1<=t<=n),表示该组合成关系中需要t件装备,下去紧跟t件装备编号(按照装备在输入中的顺序从1到n编号),表示参与合成该装备的装备编号,最后一个数s(1<=s<=1000),代表这t件物品合成道具后获得的额外价值。
- 输出:
- 对于每组测试数据,输出一个整数,代表英雄可以获得的最大价值。
- 样例输入:
3 1 100 100 20 50 9 50 9 2 2 3 1 3 1 100 100 20 50 9 50 9 2 2 3 3
- 样例输出:
20 21
装备是没有购买上限的, 这就简单多了
2. 假如给定的装备只能取一件, 装备之间又能合成新装备, 那么这道题就难了
完全背包,内层循环是从小到大。注意合成值也要单独得到花费和价值。
- public static void main(String[] args) throws Exception {
- StreamTokenizer st = new StreamTokenizer(new BufferedReader(
- new InputStreamReader(System.in)));
- while (st.nextToken() != StreamTokenizer.TT_EOF) {
- int n = (int) st.nval;
- st.nextToken();
- int m = (int) st.nval;
- st.nextToken();
- int g = (int) st.nval;
- int size = n + 1 + m;
- int p[] = new int[size];
- int v[] = new int[size];
- for (int i = 1; i < n + 1; i++) {
- st.nextToken();
- p[i] = (int) st.nval;
- st.nextToken();
- v[i] = (int) st.nval;
- }
- for (int i = n + 1; i < size; i++) {
- st.nextToken();
- int t = (int) st.nval;
- for (int j = 1; j < t + 1; j++) {
- st.nextToken();
- int seq = (int) st.nval;
- p[i] += p[seq];
- v[i] += v[seq];
- }
- st.nextToken();
- int s = (int) st.nval;
- v[i] += s;
- }
- int dp[] = new int[g + 1];
- for (int i = 1; i < size; i++) {
- for (int j = p[i]; j <= g; j++) {
- dp[j] = Math.max(dp[j], dp[j - p[i]] + v[i]);
- }
- }
- System.out.println(dp[g]);
- }
- }
- }
http://blog.csdn.net/wdy_yx/article/details/9815631
我们把合成的装备看作单独的一件装备,计算合成装备的价格(合成所需装备价格之和),合成装备的价值(合成所需装备价值之和 加上 额外价值)
- for(int i = num_weapons;i<num_weapons+num_merge;i++){
- int t=0;
- std::cin>>t;
- price[i]=0;
- value[i]=0;
- for(int j = 0;j<t;j++){
- int id_weapon;
- std::cin>>id_weapon;
- price[i]+=price[id_weapon-1];
- value[i]+=value[id_weapon-1];
- }
- int s = 0;
- std::cin>>s;
- value[i]+=s;
- }
- void dota(int num_weapons,int num_merge,int gold){
- int *price = new int[num_weapons+num_merge];
- int *value = new int[num_weapons+num_merge];
- int *maxvalue = new int[gold+1];
- for(int i = 0;i<num_weapons;i++){
- std::cin>>price[i]>>value[i];
- }
- for(int i = num_weapons;i<num_weapons+num_merge;i++){
- int t=0;
- std::cin>>t;
- price[i]=0;
- value[i]=0;
- for(int j = 0;j<t;j++){
- int id_weapon;
- std::cin>>id_weapon;
- price[i]+=price[id_weapon-1];
- value[i]+=value[id_weapon-1];
- }
- int s = 0;
- std::cin>>s;
- value[i]+=s;
- }
- for(int i = 0;i<gold+1;i++){
- maxvalue[i]=0;
- }
- for(int i = 0;i<num_weapons+num_merge;i++){
- for(int j = price[i];j<gold+1;j++){
- maxvalue[j] = std::max(maxvalue[j],maxvalue[j-price[i]]+value[i]);
- }
- }
- std::cout<< maxvalue[gold]<<std::endl;
- delete []price;
- delete []value;
- delete []maxvalue;
- }