题目:
代码(首刷看解析 2024年2月27日):
class Solution {
public:
// 思路:动态规划
int combinationSum4(vector<int>& nums, int target) {
// 1条件判断:无
// 2定义dp 初始化 总和为target的数量
vector<int> dp(target + 1, 0);
dp[0] = 1;//虚拟,实际dp[0] = 0
// 3遍历 TODO:先target,再nums(不同顺序)
for (int j = 0; j <= target; ++j) {
for (int i = 0; i < nums.size(); ++i) {
if (j - nums[i] >= 0 && dp[j] < INT_MAX - dp[j - nums[i]])
dp[j] += dp[j - nums[i]];
}
}
// 4递推公式:
return dp[target];
}
};
代码(二刷看解析 2024年7月11日 go bugfree)
这题和https://leetcode.cn/problems/coin-change-ii/ 是兄弟题,要结合起来看
func combinationSum4(nums []int, target int) int {
// 1. dp[j]表示总和为j的nums组合的个数
// 2. dp[j] = dp[j - nums[i]] + dp[j - nums[i - 1]] + ... dp[j - nums[0]]
// 3. 初始化: 总和为0的组合个数为1,即什么都不装
dp := make([]int, target + 1)
dp[0] = 1
// 4. 遍历顺序,如果先遍历物品的话,结果应该是顺序不同的序列视为同一个组合;所以可能应该先遍历背包容量
for j := 0; j <= target; j++ {
for i := 0; i < len(nums); i++ {
if j - nums[i] >= 0 {
dp[j] += dp[j - nums[i]]
}
fmt.Print("dp[",j,"]:",dp[j]," ")
}
fmt.Println("")
}
return dp[target]
}