using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static void Main()
{
var packSizes = new int[] { 5, 8, 10, 25, 50 };
var totalNeeded = 176;
var result = GeneratePackings(packSizes, totalNeeded);
Console.WriteLine(result.Count());
var maximal = result.Where (r => r.Zip(packSizes, (a, b) => a * b).Sum() == totalNeeded).ToList();
var min = maximal.Min(m => m.Sum());
var minPacks = maximal.Where (m => m.Sum() == min).ToList();
foreach (var m in minPacks) {
Console.WriteLine("{ " + string.Join(", ", m) + " }");
}
}
// Define other methods and classes here
public static List<int[]> GeneratePackings(int[] packSizes, int totalNeeded)
{
var packings = GeneratePackingsInternal(packSizes, 0, new int[packSizes.Length], totalNeeded);
return packings;
}
private static List<int[]> GeneratePackingsInternal(int[] packSizes, int packSizeIndex, int[] packCounts, int totalNeeded)
{
if (packSizeIndex >= packSizes.Length) return new List<int[]>();
var currentPackSize = packSizes[packSizeIndex];
var currentPacks = new List<int[]>();
if (packSizeIndex + 1 == packSizes.Length) {
var lastOptimal = totalNeeded / currentPackSize;
packCounts[packSizeIndex] = lastOptimal;
return new List<int[]> { packCounts };
}
for (var i = 0; i * currentPackSize <= totalNeeded; i++) {
packCounts[packSizeIndex] = i;
currentPacks.AddRange(GeneratePackingsInternal(packSizes, packSizeIndex + 1, (int[])packCounts.Clone(), totalNeeded - i * currentPackSize));
}
return currentPacks;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJdmFyIHBhY2tTaXplcyA9IG5ldyBpbnRbXSB7IDUsIDgsIDEwLCAyNSwgNTAgfTsKCQl2YXIgdG90YWxOZWVkZWQgPSAxNzY7CgoJCXZhciByZXN1bHQgPSBHZW5lcmF0ZVBhY2tpbmdzKHBhY2tTaXplcywgdG90YWxOZWVkZWQpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKHJlc3VsdC5Db3VudCgpKTsKCQl2YXIgbWF4aW1hbCA9IHJlc3VsdC5XaGVyZSAociA9PiByLlppcChwYWNrU2l6ZXMsIChhLCBiKSA9PiBhICogYikuU3VtKCkgPT0gdG90YWxOZWVkZWQpLlRvTGlzdCgpOwoJCXZhciBtaW4gPSBtYXhpbWFsLk1pbihtID0+IG0uU3VtKCkpOwoJCXZhciBtaW5QYWNrcyA9IG1heGltYWwuV2hlcmUgKG0gPT4gbS5TdW0oKSA9PSBtaW4pLlRvTGlzdCgpOwoJCQoJCWZvcmVhY2ggKHZhciBtIGluIG1pblBhY2tzKSB7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ7ICIgKyBzdHJpbmcuSm9pbigiLCAiLCBtKSArICIgfSIpOwoJCX0KCX0KCQoJLy8gRGVmaW5lIG90aGVyIG1ldGhvZHMgYW5kIGNsYXNzZXMgaGVyZQoJcHVibGljIHN0YXRpYyBMaXN0PGludFtdPiBHZW5lcmF0ZVBhY2tpbmdzKGludFtdIHBhY2tTaXplcywgaW50IHRvdGFsTmVlZGVkKQoJewoJCXZhciBwYWNraW5ncyA9IEdlbmVyYXRlUGFja2luZ3NJbnRlcm5hbChwYWNrU2l6ZXMsIDAsIG5ldyBpbnRbcGFja1NpemVzLkxlbmd0aF0sIHRvdGFsTmVlZGVkKTsKCQlyZXR1cm4gcGFja2luZ3M7Cgl9CgkKCXByaXZhdGUgc3RhdGljIExpc3Q8aW50W10+IEdlbmVyYXRlUGFja2luZ3NJbnRlcm5hbChpbnRbXSBwYWNrU2l6ZXMsIGludCBwYWNrU2l6ZUluZGV4LCBpbnRbXSBwYWNrQ291bnRzLCBpbnQgdG90YWxOZWVkZWQpCgl7CgkJaWYgKHBhY2tTaXplSW5kZXggPj0gcGFja1NpemVzLkxlbmd0aCkgcmV0dXJuIG5ldyBMaXN0PGludFtdPigpOwoJCQoJCXZhciBjdXJyZW50UGFja1NpemUgPSBwYWNrU2l6ZXNbcGFja1NpemVJbmRleF07CgkJdmFyIGN1cnJlbnRQYWNrcyA9IG5ldyBMaXN0PGludFtdPigpOwoJCQoJCWlmIChwYWNrU2l6ZUluZGV4ICsgMSA9PSBwYWNrU2l6ZXMuTGVuZ3RoKSB7CgkJCXZhciBsYXN0T3B0aW1hbCA9IHRvdGFsTmVlZGVkIC8gY3VycmVudFBhY2tTaXplOwoJCQlwYWNrQ291bnRzW3BhY2tTaXplSW5kZXhdID0gbGFzdE9wdGltYWw7CgkJCXJldHVybiBuZXcgTGlzdDxpbnRbXT4geyBwYWNrQ291bnRzIH07CgkJfQoJCQoJCWZvciAodmFyIGkgPSAwOyBpICogY3VycmVudFBhY2tTaXplIDw9IHRvdGFsTmVlZGVkOyBpKyspIHsKCQkJcGFja0NvdW50c1twYWNrU2l6ZUluZGV4XSA9IGk7CgkJCWN1cnJlbnRQYWNrcy5BZGRSYW5nZShHZW5lcmF0ZVBhY2tpbmdzSW50ZXJuYWwocGFja1NpemVzLCBwYWNrU2l6ZUluZGV4ICsgMSwgKGludFtdKXBhY2tDb3VudHMuQ2xvbmUoKSwgdG90YWxOZWVkZWQgLSBpICogY3VycmVudFBhY2tTaXplKSk7CgkJfQoJCQoJCXJldHVybiBjdXJyZW50UGFja3M7Cgl9Cgp9