Skip to content

Instantly share code, notes, and snippets.

@jsakamoto
Created January 28, 2017 08:07
Show Gist options
  • Save jsakamoto/632bb2593d83b13090c5a20834cea1d8 to your computer and use it in GitHub Desktop.
Save jsakamoto/632bb2593d83b13090c5a20834cea1d8 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
class 牛めし
{
public string 大きさ { get; set; }
public int カロリー { get; set; }
public override string ToString() => $"{大きさ} {カロリー}kcal";
}
static 牛めし[] ラインアップ = new[] {
new 牛めし { 大きさ = "ミニ盛", カロリー = 507},
new 牛めし { 大きさ = "並盛", カロリー = 709},
new 牛めし { 大きさ = "大盛", カロリー = 945},
new 牛めし { 大きさ = "特盛", カロリー = 1299}
};
static void Main(string[] args)
{
var カロリー上限 = 2000;
Console.WriteLine($"カロリー上限: {カロリー上限}");
var 組み合わせの数々 = 組み合わせ列挙(new 牛めし[0], カロリー上限);
Console.WriteLine($"組み合わせの数: {組み合わせの数々.Count()}");
var i = 0;
foreach (var 組み合わせ in 組み合わせの数々)
{
i++;
var カロリー = 組み合わせ.Sum(_ => _.カロリー);
Console.WriteLine($"{i}: {string.Join(", ", 組み合わせ.Select(_ => _.大きさ))} ({カロリー}kcal)");
}
var ベストセレクション = 組み合わせの数々
.Select(組み合わせ => new
{
内訳 = string.Join(", ", 組み合わせ.Select(_ => _.大きさ)),
カロリー = 組み合わせ.Sum(_ => _.カロリー)
})
.OrderByDescending(組み合わせ => 組み合わせ.カロリー)
.First();
System.Console.WriteLine();
Console.WriteLine(ベストセレクション.内訳);
Console.WriteLine(ベストセレクション.カロリー);
}
static IEnumerable<牛めし[]> 組み合わせ列挙(牛めし[] 組み合わせ, int カロリー上限)
{
var 新しい組み合わせの数々 = ラインアップ
.Select(牛めし => 組み合わせ.Concat(new[] { 牛めし }).ToArray())
.Where(新しい組み合わせ => 新しい組み合わせ.Sum(_ => _.カロリー) <= カロリー上限)
.ToArray();
foreach (var 新しい組み合わせ in 新しい組み合わせの数々)
{
yield return 新しい組み合わせ;
foreach (var 新しい組み合わせから生まれたさらに新しい組み合わせ in 組み合わせ列挙(新しい組み合わせ, カロリー上限))
{
yield return 新しい組み合わせから生まれたさらに新しい組み合わせ;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment