AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC204-D Cooking
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("5");
WillReturn.Add("8 3 7 2 5");
//13
}
else if (InputPattern == "Input2") {
WillReturn.Add("2");
WillReturn.Add("1000 1");
//1000
}
else if (InputPattern == "Input3") {
WillReturn.Add("9");
WillReturn.Add("3 14 15 9 26 5 35 89 79");
//138
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] TArr = InputList[1].Split(' ').Select(pX => int.Parse(pX)).ToArray();
int SumVal = TArr.Sum();
int HalfSum = SumVal / 2;
// 作成可能な和のHashSet
var SumSet = new HashSet<int>();
SumSet.Add(0);
foreach (int EachT in TArr) {
foreach (int EachSum in SumSet.ToArray()) {
int NewSum = EachT + EachSum;
if (NewSum <= HalfSum) {
SumSet.Add(NewSum);
}
}
}
Console.WriteLine(SumVal - SumSet.Max());
}
}
解説
全部の合計の半分が達成可能なら、これが解になります。
達成不可能な場合は、合計の半分以下での最大の和と、残りの合計
の組み合わせが最適解になります。
以上をふまえて、合計の半分以下で到達可能な和を列挙して、解いてます。