leetcode 377. 组合总和 Ⅳ

解题思路

完全背包计数的思路就不写了,因为这只要了解背包,就可以直接打出来了。
这题用c++写,必须用unsigned long long 来存储。数据量很大。
这里提一下完全背包的写法。其实这个题有点特殊,顺序不同的组合也要算一组,所以枚举的顺序必须是
for(int j=1;j<=target;j++)
for(int i=0;i

倘若没有顺序要求即(1,2,1)和(1,1,2)是一样的话。就要反过来写。

代码

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int n=nums.size();
        int dp[target+3];
        unsigned long long f[target+3];
        memset(dp,0,sizeof(dp));
        memset(f,0,sizeof(f));
        f[0]=1;
        for(int j=1;j<=target;j++)
        {
            for(int i=0;i<n;i++)
            {
                if(j<nums[i]) continue;
                if(dp[j-nums[i]]+nums[i]>=dp[j])
                {
                    dp[j]=dp[j-nums[i]]+nums[i];
                    f[j]+=f[j-nums[i]];
                    //cout<
                }
            }
        }
       // cout<
        return f[target];
    }
};

你可能感兴趣的:(LeetCode)