377. Combination Sum IV

  很标准的动态规划,容易得到递推公式dp(i)=dp(i-num[0])+dp(i-num[1])+......dp(i-num[n])。

   也就是最后一个数字可以是数组中的任何一个小于target的数字,然后把所有的加起来

   比如例子{1,2,3,4},则dp(4)=dp(0)+dp(1)+dp(2)+dp(3),分别为最后一步选择4,3,2,1,然后转化成了子问题

   需要注意的是给定数组不一定连续

   

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

posted @ 2016-11-22 19:45  Initial_Dream  阅读(141)  评论(0)    收藏  举报