Leetcode 动态规划的目标和
Posted
技术标签:
【中文标题】Leetcode 动态规划的目标和【英文标题】:Leetcode Target sum of dynamic programming 【发布时间】:2021-04-12 17:31:50 【问题描述】:给定 n 和 target,求 [1,2,...,n] 中的 number 的组合数加起来为 target。数字可以重复选择(1 + 1 + 2 = 4),但组合不能重复(1,1,2 和 1,2,1 视为一个组合)。例如
n = 2, target = 4: 1,1,1,1, 1,1,2, 1,3, 2,2,所以返回 4
由于我们只需要返回组合的数量,我们使用动态规划如下:
int sum(int n, int target)
vector<int> dp(target + 1);
dp[0] = 1;
for (int i = 1; i <= target; ++i)
for (int j = 1; j <= n; j++)
if (i >= j) dp[i] += dp[i - j];
return dp.back();
但是,此解决方案适用于重复组合:1,1,1,1、1,1,2、1,2,1、2,1,1、1,3 , 3,1 2,2,所以返回 7。
您知道如何修改它以删除重复项吗?
【问题讨论】:
【参考方案1】:简单修改
for (int j = 1; j <= n; j++)
for (int i = j; i <= target; i++)
dp[i] += dp[i - j];
有助于避免在较大的值之后使用较小的值,因此代码只计算已排序的组合
Alike question 具有特定硬币名义而不是 1..n 值
【讨论】:
以上是关于Leetcode 动态规划的目标和的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1449 数位成本和为目标的最大数字[动态规划] HERODING的LeetCode之路
LeetCode 1074 元素和为目标值的子矩阵数量[动态规划 前缀和 暴力] HERODING的LeetCode之路