https://leetcode.com/problems/shopping-offers/
题目大意:有n个物品,给你每个物品的价格,每个物品需要买多少个,还有多种物品的组合购买的价格,问最少多少钱恰好能买到这些物品。
数据范围是 n<=6 优惠组合<=100
解题思路:因为是恰好,所以不能多买,注意到总共的组合也没有多少,考虑深搜。
class Solution {
private boolean judge(List<Integer> s,List<Integer> needs)
{
int n = s.size();
for(int i=0;i<n-1;i++)
{
if(needs.get(i)<s.get(i)) return false;
}
return true;
}
private int dfs(List<Integer> price, List<List<Integer>> special, List<Integer> needs)
{
int minprice = 0;
int len = needs.size();
for (int i=0;i<len;i++) {
minprice += needs.get(i)*price.get(i);
}
//System.out.println(minprice);
int n = special.size();
for(int i=0;i<n;i++)
{
int tmp=-1;
List<Integer> curneed = new ArrayList<>();
if(judge(special.get(i),needs))
{
for(int j=0;j<len;j++)
{
curneed.add(needs.get(j)-special.get(i).get(j));
}
tmp = special.get(i).get(len)+dfs(price,special,curneed);
//System.out.println(special.get(i).get(n-1)+"!"+tmp);
}
if(tmp!=-1)
minprice = Math.min(minprice,tmp);
}
return minprice;
}
public int shoppingOffers(List<Integer> price, List<List<Integer>> special, List<Integer> needs) {
return dfs(price,special,needs);
}
}