子集求和 - 在子集大小为k时找到严格小于m的最大和

时间:2013-03-01 20:01:53

标签: algorithm dynamic-programming subset knapsack-problem

我正在努力解决以下问题:给定一组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的子集的答案。我正在考虑在表格中有另一个维度来跟踪已经添加的项目,但我不确定如何实现它。我已经搜索过这个网站,但是我没有找到一个能帮助我编写代码的具体答案。

有人可以帮我解决这个问题吗?

提前致谢!

0 个答案:

没有答案