题目链接:https://leetcode-cn.com/problems/combination-sum-iv/
题意
给出一个集合,求集合里面的若干数的和为给定数值的方案数,每个数可以多次选取,不同的选取顺序视作不同方案
题解
不考虑顺序就是标准的完全背包dp,但由于顺序问题这道题转化为图论解法,每个点连一条i到i+j(j in nums)的边,然后从头往后dp即可,复杂度n*t
使用c++注意,虽然题目保证了答案不会超过int范围,但dp过程中的值可能超过int,甚至超过ll,建议使用ull或取模处理(因为这些溢出答案都不会转移到最终解)
code
class Solution
{
public:
int combinationSum4(vector<int> &nums, int target)
{
vector<unsigned long long> dp(target + 1, 0);
dp[0] = 1;
for (int i = 0; i < target; i++)
{
for (int j = 0; j < nums.size(); j++)
{
if (i + nums[j] <= target)
{
dp[i + nums[j]] += dp[i];
}
}
}
return dp[target];
}
};