Я хочу реализовать алгоритм динамического программирования для этой задачи: Вход: Данное устройство S неотрицательных чисел {S1 ....... Sn}Динамическое программирование: Сбалансированный Partition
мы хотим разделите S на 2 подмножества S1 и S2 и минимизируйте | sum (S1) -sum (S2) |, затем разделим 2 подмножество таким же образом, остановимся, когда мы достигнем подмножества с 2 или 1 элементом(). Мы должны сохранить порядок элементов S).
пример: S = {1,2,2,3,4} Выход {{{1,2} {2}} {3,4}}
С помощью this article это моя реализация :
static String partition(int s[], int db,int fn)
{
int n = (fn-db) +1;
String res ="";
if (n<=2){
res +="[";
for(int l =db ;l<=fn;l++) res+=s[l];
res +="]";
return res;
}
int[][] m= new int [n+1][3]; /* DP table for values */
int[][] d= new int [n+1][3]; /* DP table for dividers */
int [] p = new int [n+1]; /* prefix sums array */
int cost; /* test split cost */
int i,x = 0; /* counters */
p[0] = 0; /* construct prefix sums */
for (i=1; i<=n; i++)
p[i]=p[i-1]+s[(db-1)+i];
for (i=1; i<=n; i++)
m[i][1] = p[i]; /* initialize boundaries */
m[1][2] = s[db];
for (i=2; i<=n; i++){ /* evaluate main recurrence */
m[i][2] = Integer.MAX_VALUE;
for (x=1; x<=(i-1); x++) {
cost = Math.max(m[x][1], p[i]-p[x]);
if (m[i][2] > cost) {
m[i][2] = cost;
d[i][2] = db+(x-1);
}
}
}
return res +="["+partition(s,db,d[n][2])+partition(s,d[n][2]+1,fn)+"]";
}
public static void main(String[] args) {
int []set ={2,1,1,1,5};
System.out.print(partition(set,0,set.length-1));
}
является ли моя реализация является хорошим или есть другое динамическое решение программирующий whitout рекурсивный вызов?
Я не могу рассчитать сложность этого алгоритма, я пытаюсь использовать теорему Мастера T (n) = aT (nb) + f (n), но теперь я не n/b размер каждой подзадачи для 2 рекурсивный вызов.
3.Как мы можем сделать тот же раздел, если мы сможем изменить порядок элементов?
Я не совсем понимаю, как ваше описание проблемы подходит для примера. Для '{1,2,2,3,4}' раздела 'S1 = {2,3,1}', 'S2 = {4,2}' приведет к отличию '0', что лучше, чем разница в 1. – Codor
раздел должен уважать порядок начального массива S. – lastfour
Поскольку у вас есть код здесь, вы должны пометить язык. – crashmstr