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