LeetCode(39)

复制代码
class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        vector<vector<int>>v,result;
        vector<int>v2;
        map<vector<int>,int>mp;
        int n = candidates.size(),sum,t,n2,n3;
        v.push_back(v2);
        // for(int i=0;i<candidates.size();i++){
        //     cout<<candidates[i]<<" ";
        // }
        // cout<<endl;
        mp[v2] = 0;
        for(int i=0;i<n;i++){
            n2 = v.size();
            for(int k=0;k<n2;k++){
                // bool flag = false;
                for(int j=1;mp[v[k]]+j*candidates[i]<=target;j++){
                    v2 = v[k];
                    v2.push_back(candidates[i]);
                    v2.push_back(j);
                    if(mp[v[k]]+candidates[i]*j<=target){
                        v.push_back(v2);
                        mp[v2] = mp[v[k]]+candidates[i]*j;
                        // for(int l=0;l<v.size();l++){
                        //     for(int m=0;m<v[l].size();m++){
                        //         cout<<v[l][m]<<" ";
                        //     }
                        //     cout<<endl;
                        // }
                        // cout<<endl;
                        // flag = true;
                    }
                }
                // if(!flag)break;
            }
        }
        n2 = v.size();
        for(int i=0;i<n2;i++){
            if(mp[v[i]]==target){
                n3 = v[i].size();
                v2.clear();
                for(int j=0;j<n3;j+=2){
                    for(int k=0;k<v[i][j+1];k++){
                        v2.push_back(v[i][j]);
                    }
                }
                result.push_back(v2);
            }
        }
        sort(result.begin(),result.end());
        return result;
    }
private:
    bool isSame(vector<vector<int>>v,vector<int>v2){
        int n = v.size(),m = v2.size();
        for(int i=0;i<n;i++){
            int p = v[i].size();
            if(p==m){
                bool flag = true;
                for(int j=0;j<m;j++){
                    if(v[i][j]!=v2[j]){
                        flag = false;
                        break;
                    }
                }
                if(flag)
                    return true;
            }
        }
        return false;
    }
};
复制代码

 

posted @   智人心  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示