给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target
的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 提示:
- 1 <= nums.length <= 200
- 1 <= nums[i] <= 1000
- nums 中的所有元素 互不相同
- 1 <=target <= 1000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/combination-sum-iv
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iv
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int cmp(int* px,int* py){
return (*px)>(*py);
}
int combinationSum4(int* nums, int numsSize, int target){
unsigned int dp[target+1];
dp[0] = 1;
qsort(nums,numsSize,sizeof(int),cmp); /排序后计算可以省略部分时间
for(int i = 1; i <= target; i++)
{
dp[i] = 0;
for(int j = 0; j < numsSize; j++)
{
int res = i - nums[j];
if(res >= 0)
{
dp[i] += dp[res];
}
else
{
break;
}
}
}
return dp[target];
}
思路:动态规划
这个题目可以重复使用同一个数字,首先思考使用回溯算法,不过超时了。改用动态规划:一般考虑如何使用前面得到的结果来得到后面的结果。比如:nums:[1,2,3] target:4
那么使用dp数组记录计算过的数字,dp[i]表示target=i时,结果为dp[i]。那么dp[4]的结果可以这样想,dp[4] = dp[4-1] + dp[4-2] + dp[4-3],
dp[3] = dp[3-1] + dp[3-2] + dp[3-3] ,
dp[2] = dp[2-1] + dp[2-2],
dp[1] = dp[1-1]
那么状态转移方程就可以得到:
dp[i] = sum(dp[i - nums[j]) (i - nums[j] >= 0)