Предположим, что каждый массив имеет п элементов. Одним из решений является попытка использовать все возможные комбинации из n элементов, что означает, что сложность времени равна O(2^n)
.
В то время как использовать динамическое программирование может достичь O(n*k)
времени сложность:
dp[i][j] = x
означает, что в течение первых я элементов, выбрать некоторые элементы из массива 2, а сумма выбранных элементов массива 2, у (0 < = J < k), максимальная сумма соответствующих выбранных элементов массива 1 равна x. Затем мы хотим dp[n][j]
(0 < = j < k) максимум.
Уравнение перехода состояния состоит в том, чтобы попытаться выбрать i-й элемент массива 2. Если не выбран, dp[i][j] = dp[i-1][j]
; Если выбрано, dp [i] [j] может быть max(dp[i-1][j], dp[i-1][j-b[i]] + a[i])
, здесь b [i] < = j < k.
for(int i=1;i<=n;i++) {
for(int j=0;j<k;j++) {
dp[i][j] = 0;
}
}
if(b[1] < k) {
dp[1][b[0]] = a[0];
}
for(i=2;i<=n;i++) {
for(j=0;j<k;j++) {
dp[i][j] = dp[i-1][j];
if(j >= b[i] && dp[i-1][j - b[i]] + a[i] > dp[i][j]) {
dp[i][j] = dp[i-1][j - b[i]] + a[i];
}
}
}
Ответ max(d[[n][j]), 0 <= j< k
.
Выберите другой алгоритм в зависимости от того, насколько велики n
и k
.
в вашем случае, что ответ? – coderz
Я выберу 10, 4 и 5 из первого массива так, чтобы сумма соответствующих элементов во втором массиве была равна 14. –
Разве это не проблема с рюкзаком? –