反问:
正和 <= K 的最大长度子序列实际上是标准的 01 背包问题。
它的解决方案非常简单:
int solve(const vector<int> &A, int K) {
int dp[A.size()+1][K+1];
int i, j;
// Base Cases
for(i=0; i<= K; i++)
dp[0][i] = 0;
for(i=0; i<= A.size(); i++)
dp[i][0] = 0;
for(i=1; i <= A.size(); i++)
{
for(j=1; j<= K; j++)
{
dp[i][j] = dp[i-1][j];
if(A[i-1] <= j)
dp[i][j] = max(dp[i][j], 1 + dp[i-1][j-A[i-1]]);
}
}
return dp[A.size()][K]
我很难考虑如何以相同的方式实现sum <= K 的最小长度子序列。
例子:
A = [14, 10, 4]
K = 14
Minimum Length Subsequence = 14
Maximum Length Subsequence = 10, 4 (Arrived from Knapsack)
它当然不像将最大值更改为最小值那样简单,因为答案始终是基本情况。这让我想到,我们是否需要调整基本情况?我被困在这里,需要一些推动。
关于如何解决这个问题的任何想法?