Re[7]: Вариация задачи о сдаче
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.01.23 17:23
Оценка: 120 (1)
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, gandjustas, Вы писали:

S>>>Пусть будут десятки чисел.
G>>Чем перебор не устраивает?
S>комбинаторикой.

Вот накидал перебором для 50 до 1000 чисел https://dotnetfiddle.net/q51ICI
С 50 числами до 1000 работает за 0.1, с числами до 1М за 0.14
Можно пооптимизировать, можно применить ДП, думаю будет еще быстрее

using System;
using System.Linq;
using System.Collections.Generic;

var rnd = new Random();

var numbers = Enumerable.Range(0, 50).Select(_ => rnd.Next(2,1000)).ToArray();
Array.Sort(numbers);
Console.WriteLine($"[{string.Join(", ",numbers)}]");

var filtered = numbers.Where((x, i)  => !IsSumOf(x, numbers[0..i]));

Console.WriteLine($"Filtered [{string.Join(", ",filtered)}]");

bool IsSumOf(int x, Span<int> numbers)
{
    if (numbers.Length == 0) return false;
    var h = numbers[^1];
    var mod = x % h;
    if (mod == 0) return true;    
    for (var i = x / h; i>= 0; i--)
    {
        if (IsSumOf(x - i * h, numbers[..^1])) return true;
    }
    return false;
}
Отредактировано 17.01.2023 18:16 gandjustas . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.