利用DFS进行枚举,每次dfs时,判断当前needs能否使用某个大礼包来替换,若能,就更新needs数组,进行下一次dfs,直到没有可以替换的大礼包为止。
代码是抄的题解的:
class Solution {
public:
bool valid(vector<int> &special_single, vector<int> &needs){
for(int i=0;i<needs.size();i++)
if(special_single[i]>needs[i])
return false;
return true;
}
int dfs(vector<int>& price, vector<vector<int>>& special, vector<int>& needs){
int min_money = 0; //表示最小值
for(int i=0;i<needs.size();i++){
min_money += price[i] * needs[i]; //初始化min_money,若没有替换的大礼包,返回这个值
}
for(int i=0;i<special.size();i++){
if(valid(special[i],needs)){
vector<int> new_needs; //新建一个数组 表示新的needs
for(int j=0;j<needs.size();j++)
new_needs.push_back(needs[j]-special[i][j]); //新的needs = 旧的needs - 礼包中物品的个数
int money_tmp = shoppingOffers(price,special,new_needs)+ special[i].back(); //新的needs所对应的最小值上当前大礼包的价格
min_money = min(min_money,money_tmp); //最后求出最低价格
}
}
return min_money;
}
int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
return dfs(price,special,needs);
}
};