本题其实是多重背包问题,对于价值和重量都是nums[i]的的物品,求装满这个容量为4的背包共有多少种排列方式
如果是组合问题,那么遍历顺序是先物品后背包,这样能保证物品按从小到大顺序依次放置,对于实例1求出来为4;但是本题其实是排列问题,那么遍历顺序就应该是先背包再物品,先固定背包的大小,再依次放置物品进行试探就能保证求出排列数
cpp
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
int n=nums.size(),bagWeight=target;
vector<int> dp(bagWeight+1,0);
dp[0]=1;
for(int i=0;i<=bagWeight;i++)
for(int j=0;j<n;j++)
if(i>=nums[j])
if(dp[i]<INT_MAX-dp[i-nums[j]])
dp[i]+=dp[i-nums[j]];
return dp[bagWeight];
}
};