【发布时间】:2023-03-08 17:16:01
【问题描述】:
给定 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。
您知道如何修改它以删除重复项吗?
【问题讨论】:
标签: algorithm