给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
思路:
动规五部曲
1、dp数组下标及其含义:背包容量为j的背包最多有dp[j]种装满方式(排列形式);
2、递推关系式:(装满背包的方式)dp[j]+=dp[j-nums[i]];
3、初始化:dp[0]为1,其余为0;
4、遍历顺序:由于要求为装满背包的最大排列数量,所以先背包,再物品。同时注意物品可以取无限次,所以背包正序;
5、举例验证dp数组。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
//初始化
vector<int> dp(target+1,0);
dp[0]=1;
//遍历顺序 由于要求为排列结果,所以先背包、后物品
for(int j=0;j<=target;j++)
{
for(int i=0;i<nums.size();i++)
{
if(j>=nums[i] && dp[j]<INT_MAX-dp[j-nums[i]]) dp[j]+=dp[j-nums[i]];
}
}
return dp[target];
}
};
出现这个错误,所以加上一个判断语句,防止dp[j]超过int可以表示的最大范围。