сумма подмножества - нахождение максимальной суммы строго ниже m с размером подмножества k

Я борюсь со следующей проблемой: учитывая набор из n элементов, найдите максимальную сумму подмножества размера k, которое строго меньше и как можно ближе к заданному числу m.

Я решил проблему без ограничения, что подмножество должно иметь размер k, и это мой код (nums - это массив, в котором я сохраняю свои n чисел):

// clear the dp array
int dp[n+1][m+1];
for(int i = 0; i < n+1; i++)
    for(int j = 0; j < m+1; j++)
        dp[i][j] = 0;

for(int j = 1; j <= n; j++)
{
    for(int w = 1; w < m; w++)
    {
        if(nums[j-1] <= w) dp[j][w] = max(dp[j-1][w], nums[j-1] + dp[j-1][w - nums[j-1]]);
        else dp[j][w] = dp[j-1][w];
    }
}
cout << dp[n][m-1];

Однако я не уверен, как расширить свой код, чтобы дать ответ с подмножествами размера k. Я думал о том, чтобы иметь еще одно измерение в таблице, которое отслеживает уже добавленные элементы, но я не уверен, как это реализовать. Я уже искал этот сайт, но не нашел конкретного ответа, который помог бы мне написать код.

Может ли кто-нибудь помочь мне с этим?

Заранее спасибо!


person Devos50    schedule 01.03.2013    source источник
comment
Это очень похоже на этот вопрос: из k элементов, не превышающих m%23comment21280149_15120659"> stackoverflow.com/questions/15120659/   -  person Udo Klein    schedule 02.03.2013
comment
@ruakh Нет, это не специально, я отредактировал, спасибо!   -  person Devos50    schedule 02.03.2013
comment
@UdoKlein это именно та проблема, которую я решаю! :D Попробую оптимизированный брутфорс, спасибо за ссылку!   -  person Devos50    schedule 02.03.2013
comment
Если вы решите эту проблему, вы сможете решить проблему с суммой подмножества, так что эта проблема NP -полный   -  person Andrew Mao    schedule 02.03.2013