题意
传送门 LeeCode 39. 组合总和
题解
完全背包问题,
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 代表从前
i
i
i 种物品中挑选使数字和为
t
a
r
g
e
t
target
target 的组合
d
p
[
i
]
[
j
]
=
{
d
p
[
i
−
1
]
[
j
]
c
a
n
d
i
d
a
t
e
s
[
i
]
<
j
d
p
[
i
−
1
]
[
j
]
+
(
d
p
[
i
]
[
j
−
c
a
n
d
i
d
a
t
e
s
[
i
]
]
加
入
c
a
n
d
i
d
a
t
e
s
[
i
]
)
o
t
h
e
r
w
i
s
e
dp[i][j]=\begin{cases}dp[i-1][j]&candidates[i]<j\\ dp[i-1][j]+(dp[i][j-candidates[i]]加入candidates[i])&otherwise\\ \end{cases}
dp[i][j]={dp[i−1][j]dp[i−1][j]+(dp[i][j−candidates[i]]加入candidates[i])candidates[i]<jotherwise
class Solution
{
public:
vector<vector<int>> combinationSum(vector<int> &candidates, int target)
{
vector<vector<vector<int>>> dp(target + 1);
dp[0].push_back({});
for (auto n : candidates)
{
for (int i = n; i <= target; i++)
{
for (auto s : dp[i - n])
{
s.push_back(n);
dp[i].push_back(s);
}
}
}
return dp[target];
}
};