下图是一个装备系统的合成图谱,箭头指向的是合成之后的装备,每合成一个装备需要消耗一些金币(标注在矩形框里面),箭头上的数字表示合成所需的材料数量。比如,要合成n个装备A,需要消耗3n个装备B、1n个装备C、4n个装备D,而且还需要消耗26n金币(装备B和装备D的合成与此类似)。
为了简单起见,下面两个题目的装备图谱都是一棵多叉树,而且玩家最初只拥有指定数量的叶子节点的装备,也就是图中的装备C、装备E、装备F和装备G。
注意,下面的图谱只是一个例子,作答的时候不要局限于这个图谱。
请从下面的题目中选择一个来作答:
⦁ (简单难度)已知玩家拥有一些初级装备(叶子节点的装备)并且所有装备的合成所需消耗的金币都为0,玩家需要合成尽可能多的某个装备(记为装备X),请用C#语言计算出玩家最多可以合成出多少个装备X。
⦁ (中等难度)已知玩家拥有一些初级装备(叶子节点的装备)和n个金币,并且所有装备的合成都需要消耗金币,玩家需要合成尽可能多的某个装备(记为装备X),请用C#语言计算出玩家最多可以合成出多少个装备X。
为了规范输入输出,下面给出代码的基本结构,作答的时候不要修改Run函数的函数原型。
public class Exam
{
public class MaterialData
{
public ItemData item; //合成所需的物品
public int count; //合成所需的该物品的数量
}
public class ItemData
{
public int id; //物品 ID
public int count; //当前拥有的物品数量
public int costGold; //合成该物品所需的金币
public List materialList; //合成该物品所需的材料
}
///
/// 计算用 totalGold 金币最多可以合成的 item 装备的数量
///
/// 要合成的装备
/// 拥有的金币
/// 可合成的 item 装备的最大数量
public int Run(ItemData item, int totalGold)
{
return 0;
}
}
(中等难度的)其实就是多加了一个限制条件,早个时间再来处理
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class xxxxxxxxxxxxx : MonoBehaviour {
// Use this for initialization
void Start () {
Exam ex = new Exam();
Exam.ItemData item = CreateTestDataA();
Debug.Log(ex.Run(item,0));
}
Exam.ItemData CreateTestDataA()
{
Exam.ItemData item = new Exam.ItemData();
item.count = 0;
item.costGold = 0;
item.id = 1;
item.materialList = new List();
item.materialList.Add( CreateTestDataB());
item.materialList.Add(CreateTestDataC());
item.materialList.Add(CreateTestDataD());
return item;
}
Exam.MaterialData CreateTestDataB()
{
Exam.MaterialData material = new Exam.MaterialData();
material.count = 3;
Exam.ItemData item = new Exam.ItemData();
item.id = 2;
item.count = 0;
item.costGold = 0;
item.materialList = new List();
item.materialList.Add(CreateTestDataE());
item.materialList.Add(CreateTestDataF());
material.item = item;
return material;
}
Exam.MaterialData CreateTestDataD()
{
Exam.MaterialData material = new Exam.MaterialData();
material.count = 4;
Exam.ItemData item = new Exam.ItemData();
item.count = 0;
item.costGold = 0;
item.id = 4;
item.materialList = new List();
item.materialList.Add(CreateTestDataG());
material.item = item;
return material;
}
Exam.MaterialData CreateTestDataC()
{
Exam.MaterialData material = new Exam.MaterialData();
material.count = 1;
Exam.ItemData item = new Exam.ItemData();
item.count = 100;
item.id = 3;
item.costGold = 0;
material.item = item;
item.materialList = new List();
return material;
}
Exam.MaterialData CreateTestDataE()
{
Exam.MaterialData material = new Exam.MaterialData();
material.count = 1;
Exam.ItemData item = new Exam.ItemData();
item.count = 100;
item.id = 5;
item.costGold = 0;
material.item = item;
item.materialList = new List();
return material;
}
Exam.MaterialData CreateTestDataF()
{
Exam.MaterialData material = new Exam.MaterialData();
material.count = 5;
Exam.ItemData item = new Exam.ItemData();
item.count = 100;
item.id = 6;
item.costGold = 0;
material.item = item;
item.materialList = new List();
return material;
}
Exam.MaterialData CreateTestDataG()
{
Exam.MaterialData material = new Exam.MaterialData();
material.count = 9;
Exam.ItemData item = new Exam.ItemData();
item.count = 100;
item.id = 7;
item.costGold = 0;
material.item = item;
item.materialList = new List();
return material;
}
}
public class Exam
{
public class MaterialData
{
public ItemData item; //合成所需的物品
public int count; //合成所需的该物品的数量
}
public class ItemData
{
public int id; //物品 ID
public int count; //当前拥有的物品数量
public int costGold; //合成该物品所需的金币
public List materialList; //合成该物品所需的材料
}
///
/// 计算用 totalGold 金币最多可以合成的 item 装备的数量
///
/// 要合成的装备
/// 拥有的金币
/// 可合成的 item 装备的最大数量
public int Run(ItemData item, int totalGold)
{
int count = item.materialList.Count;
if (count == 0)
{
return item.count;
}
int curCount = Run(item.materialList[0].item, 0);
int conCount = curCount / item.materialList[0].count;
int minCount = conCount;
for (int i = 1; i < count; i++)
{
curCount = Run(item.materialList[i].item, 0);
conCount = curCount / item.materialList[i].count;
if (conCount < minCount)
{
minCount = conCount;
}
}
Debug.Log(item.id+":"+minCount);
return minCount;
}
}