Я изучаю динамическое программирование, и я хочу немного поменять классическую проблему с подмножеством, распечатав все подмножества, которые составляют число. Как именно я буду заниматься этим? В настоящее время, я знаю, как печатать истинным или ложным в зависимости от того существует подмножество, которое добавляет к немуподмножество sum найти все подмножества, которые составляют число
public static boolean hasSum(int [] array, int sum)
{
int len = array.length;
boolean[][] table = new boolean[sum+1][len+1];
int i;
for(i = 0; i <= len; i++)
table[0][i] = true;
for(i = 1; i <= sum; i++)
table[i][0] = false;
for(i = 1; i <= sum; i++)
{
for(int j = 1; j <= len; j++)
{
table[i][j] = table[i][j-1];
if(!table[i][j] && i >= array[j-1])
table[i][j] = table[i-array[j-1]][j-1];
}
}
return table[sum][len];
}
, если это возможно, я хотел бы вернуть массив всех подмножеств.
Да, это то, о чем я думал. В каждом индексе таблицы я бы сохранил последний номер? Чтобы добавить, например, 10 для {2,4,5,6,8,1), я мог бы взять 1, поскольку он был последним до 10, затем 5, поскольку это было последним до 9 с 4, и затем 4 от добавления к 4, что делает его [4,5,1]? Я надеюсь, что это ясно – seanscal