トップページに戻る
次の増井さんの書籍の問題へ
前の増井さんの書籍の問題へ
Q05 いまだに現金払い?
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
struct JyoutaiDef
{
internal int CurrP;
internal List<int> CoinList;
}
static void Main()
{
var stk = new Stack<JyoutaiDef>();
JyoutaiDef WillPush;
WillPush.CurrP = 0;
WillPush.CoinList = new List<int>();
stk.Push(WillPush);
int AnswerCnt = 0;
while (stk.Count > 0) {
JyoutaiDef Popped = stk.Pop();
//クリア判定
if (Popped.CoinList.Sum() == 1000) {
AnswerCnt++;
Console.WriteLine("解{0}を発見", AnswerCnt);
var wkEnum = Popped.CoinList.GroupBy(X => X).OrderBy(X => X.Key);
foreach (var EachGroup in wkEnum) {
Console.Write("{0}円玉が{1}枚。", EachGroup.Key, EachGroup.Count());
}
Console.WriteLine();
continue;
}
//枝切り
if (Popped.CoinList.Count >= 15) continue;
int[] CoinArr = { 10, 50, 100, 500 };
for (int I = Popped.CurrP; I <= CoinArr.GetUpperBound(0); I++) {
WillPush.CurrP = I;
WillPush.CoinList = new List<int>(Popped.CoinList) { CoinArr[I] };
//枝切り
if (WillPush.CoinList.Sum() > 1000) continue;
stk.Push(WillPush);
}
}
}
}
実行結果
省略
解18を発見
10円玉が5枚。50円玉が7枚。100円玉が1枚。500円玉が1枚。
解19を発見
10円玉が5枚。50円玉が9枚。500円玉が1枚。
解20を発見
10円玉が10枚。100円玉が4枚。500円玉が1枚。
解説
深さ優先探索でナイーブに解いてます。