Я пытаюсь реализовать проблему «Подсчет различных способов express N как сумму других чисел» с C# с использованием динамического c программирования. Мой метод выглядит так:
static int howManyWays(int n)
{
int [] safe= new int[n + 1];
// base cases
safe[0] = safe[1] = safe[2] = 1;
safe[3] = 2;
// iterate for all values from 4 to n
for (int i = 4; i <= n; i++)
safe[i] = safe[i - 1] + safe[i - 3]
+ safe[i - 4];
return safe[n];
}
Например, если я выберу n
как n = 4
, то мои результаты будут:
4
Я хочу распечатать эти 4 комбинации сумм:
1+1+1+1
1+3
3+1
4
Есть ли способ сделать это рекурсивно или с использованием динамического c программирования? Моя попытка - рекурсивно получить набор комбинаций:
static int[] Combs(int n)
{
int[] tusc = { };
if (n < 0)
yield break;
if (n == 0)
yield return tusc;
int[] X = { 1, 3, 4 };
for(int i = 0; i < X.Length; i++)
{
for(j = 0; j <= Combs(n-X[i]).Length; j++)
{
yield return X + j;
}
}
}
Исходный код, который работает в python, но не знаю, как преобразовать в C#:
def combis(n):
if n < 0:
return
if n == 0:
yield []
for x in (1, 3, 4):
for combi in combis(n-x):
yield [x] + combi
>>> list(combis(5))
[[1, 1, 1, 1, 1], [1, 1, 3], [1, 3, 1], [1, 4], [3, 1, 1], [4, 1]]