前言
今天的题目有点意思,看了半天才看懂,第二个礼包的list中的每个list,头几个是礼包中各个物品的数量,最后一个礼包价格,为此最低价格有两种策略,首先第一种是不购买礼包,直接使用needs和price相乘。另外一种是购买礼包,礼包的数量不能大于needs数量,所以这里需要一个判断,其次我们只要迭代的每次更新needs的数量就可以计算出来。
本次方法首先没有用map,单纯计算。加了一个map的原因是,减少检查,当needs的数量是出现过的,直接输出即可
题目
源码
class Solution {
public int shoppingOffers(List<Integer> price, List<List<Integer>> special, List<Integer> needs) {
Map<List<Integer>,Integer> map =new HashMap<>();
return dfs(price,special,needs,map);
}
public int dfs(List<Integer>price,List<List<Integer>> special,List<Integer>needs,Map<List<Integer>,Integer> map){
if(map.containsKey(needs)){
return map.get(needs);
}
int res=multipy(needs,price);//不买礼包
int j=0;
for(List<Integer> s:special){
List<Integer> clone_needs=new ArrayList<>(needs);
for(j=0;j<needs.size();++j){
int diff=needs.get(j)-s.get(j);//计算礼包中的数量和所需数量的差
if(diff<0){//供大于求,砍掉方案
break;
}
clone_needs.set(j,diff);//更新needs
}
if(j==needs.size()){//若满足礼包每件商品都小于所需的数量
res=Math.min(res,s.get(j)+dfs(price,special,clone_needs,map));//比较不需要礼包,和使用礼包的递归计算
}
}
map.put(needs,res);
return res;
}
public int multipy(List<Integer> a,List<Integer>b){
int sum=0;
for(int i=0;i<a.size();++i){
sum += a.get(i)*b.get(i);
}
return sum;
}
}