具体思想:
记忆化搜索,是没想到还能这么搜的;
采用完全背包有6个维度,有个牛批的人居然做出来,这我他妈的是没想到的;
DP感觉和记忆化搜索类似,是否是一种?
具体代码:
class Solution {
public:
int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
int n=needs.size();
vector<vector<int>> filter;
for(auto& vec:special){
int iszero=0;
int sum=0;
for(int i=0;i<n;i++){
iszero+=vec[i];
sum+=vec[i]*price[i];
}
if(iszero==0||sum<vec[n])
continue;
filter.push_back(vec);
}
return dfs(price,filter,needs);
}
int dfs(vector<int>& price, vector<vector<int>>& special, vector<int> curneed){
if(!mp.count(curneed)){
int sum=0;
for(int i=0;i<curneed.size();i++){
sum+=price[i]*curneed[i];
}
for(auto ele:special){
//遍历每一个可用的大礼包;
vector<int> nextneed;
for(int i=0;i<price.size();i++){
if(curneed[i]<ele[i])
break;
nextneed.push_back(curneed[i]-ele[i]);
}
if(nextneed.size()!=price.size()){
continue;
//该礼包没法买;
}
sum=min(sum,dfs(price,special,nextneed)+*ele.rbegin());
}
mp[curneed]=sum;
}
return mp[curneed];
}
private:
map<vector<int>,int>mp;
};