Combination Sum IV

来源:互联网 发布:windows安装光盘图片 编辑:程序博客网 时间:2024/06/08 00:33

第一种方法:

dfs遍历,时间复杂度(nums.size())^target,超时

class Solution {public:    int combinationSum4(vector<int>& nums, int target) {        int count = 0;        dfs(nums,0,count,target);        return count;    }        void dfs(const vector<int>& nums, int sum, int & count, const int & target)    {        if(sum==target){count++;return;}        if(sum>target)        return;        for(auto it = nums.begin();it!=nums.end();it++)        {            dfs(nums,sum+*it,count,target);        }    }};

第二种方法:

动态规划。分析上一种方法可以发现:dfs每次向下遍历时有很多子问题是重复的,这符合动态规划的思想,建立动态规划数组vector<int> dp(target+1,0);状态转移方程为dp[i]=Σdp[i-nums[k]] , 0<=k<nums.size();dp[i]表示当target为i 时,有多少种组合。

class Solution {public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target + 1, 0);for (int i = 0; i <= target; i++) {for (int k = 0; k < nums.size(); k++) {if (i - nums[k] > 0) {dp[i] += dp[i - nums[k]];}else if (i - nums[k] == 0) {dp[i] += 1;}}}return dp[target];}};


0 0
原创粉丝点击