下图是一个装备系统的合成图谱,箭头指向的是合成之后的装备,每合成一个装备需要消耗一些金币(标注在矩形框里面),箭头上的数字表示合成所需的材料数量。比如,要合成n个装备A,需要消耗3n个装备B、1n个装备C、4n个装备D,而且还需要消耗26n金币(装备B和装备D的合成与此类似)。
为了简单起见,下面两个题目的装备图谱都是一棵多叉树,而且玩家最初只拥有指定数量的叶子节点的装备,也就是图中的装备C、装备E、装备F和装备G。
注意,下面的图谱只是一个例子,作答的时候不要局限于这个图谱。
请从下面的题目中选择一个来作答:
- (简单难度)已知玩家拥有一些初级装备(叶子节点的装备)并且所有装备的合成所需消耗的金币都为0,玩家需要合成尽可能多的某个装备(记为装备X),请用C#语言计算出玩家最多可以合成出多少个装备X。
- (中等难度)已知玩家拥有一些初级装备(叶子节点的装备)和n个金币,并且所有装备的合成都需要消耗金币,玩家需要合成尽可能多的某个装备(记为装备X),请用C#语言计算出玩家最多可以合成出多少个装备X。
请在收到题目的一至两天内完成,提交的时候只需要提交源代码,并且在代码里面注明选择的是哪个题目。为了规范输入输出,下面给出代码的基本结构,作答的时候不要修改Run函数的函数原型。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Compose
{
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<MaterialData> materialList; //合成该物品所需的材料
}
/// <summary>
/// 计算用 totalGold 金币最多可以合成的 item 装备的数量
/// </summary>
/// <param name="item">要合成的装备</param>
/// <param name="totalGold">拥有的金币</param>
/// <returns>可合成的 item 装备的最大数量</returns>
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 gold=item.materialList[0].item.costGold;
if (gold< totalGold)
{
return 0;
}
int countGold=gold / totalGold;
int minCount = countGold < conCount? countGold: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;
}
}
return minCount;
}
public ItemData itemDataA { get; private set; }
public MaterialData materB { get; private set; }
public MaterialData materC { get; private set; }
public MaterialData materD { get; private set; }
public MaterialData materE { get; private set; }
public MaterialData materF { get; private set; }
public MaterialData materG { get; private set; }
public MaterialData CreatData(int materialCount , int itemCount, int id, int costGold,params MaterialData[] materialDatas)
{
MaterialData material = new Exam.MaterialData();
material.count = materialCount;
ItemData item = new Exam.ItemData();
item.id = id;
item.count = itemCount;
item.costGold = costGold;
item.materialList = new List<MaterialData>();
if (materialDatas!=null&&materialDatas.Length>0)
{
for (int i = 0; i < materialDatas.Length; i++)
{
item.materialList.Add(materialDatas[i]);
}
}
material.item = item;
return material;
}
public Exam()
{
this.materG = CreatData(9, 81, 7, 500, null);
this.materF = CreatData(5, 150, 6, 500, null);
this.materE = CreatData(1, 150, 5, 500, null);
this.materD = CreatData(4, 0, 4, 58, materG);
this.materC = CreatData(1, 50, 3, 500, null);
this.materB = CreatData(3, 0, 2, 53, materE, materF);
this.itemDataA = new ItemData();
this.itemDataA.id = 1;
this.itemDataA.count = 0;
this.itemDataA.costGold = 26;
this.itemDataA.materialList = new List<Exam.MaterialData>();
this.itemDataA.materialList.Add(this.materB);
this.itemDataA.materialList.Add(this.materC);
this.itemDataA.materialList.Add(this.materD);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Compose
{
/// <summary>
/// 中等难度
/// </summary>
class Program
{
static void Main(string[] args)
{
Exam exam=new Exam();
int count=exam.Run(exam.materD.item, exam.materD.item.costGold);
Console.WriteLine("可以合成出"+count+ "个装备");
Console.ReadKey();
}
}
}