In LeetCode Store, there are some kinds of items to sell. Each item has a price.

However, there are some special offers, and a special offer consists of one or more different kinds of items with a sale price.

You are given the each item's price, a set of special offers, and the number we need to buy for each item. The job is to output the lowest price you have to pay for exactly certain items as given, where you could make optimal use of the special offers.

Each special offer is represented in the form of an array, the last number represents the price you need to pay for this special offer, other numbers represents how many specific items you could get if you buy this offer.

You could use any of special offers as many times as you want.

Example 1:

Input: [2,5], [[3,0,5],[1,2,10]], [3,2]
Output: 14
Explanation:
There are two kinds of items, A and B. Their prices are $2 and $5 respectively.
In special offer 1, you can pay $5 for 3A and 0B
In special offer 2, you can pay $10 for 1A and 2B.
You need to buy 3A and 2B, so you may pay $10 for 1A and 2B (special offer #2), and $4 for 2A.

Example 2:

Input: [2,3,4], [[1,1,0,4],[2,2,1,9]], [1,2,1]
Output: 11
Explanation:
The price of A is $2, and $3 for B, $4 for C.
You may pay $4 for 1A and 1B, and $9 for 2A ,2B and 1C.
You need to buy 1A ,2B and 1C, so you may pay $4 for 1A and 1B (special offer #1), and $3 for 1B, $4 for 1C.
You cannot add more items, though only $9 for 2A ,2B and 1C.

Note:

  1. There are at most 6 kinds of items, 100 special offers.
  2. For each item, you need to buy at most 6 of them.
  3. You are not allowed to buy more items than you want, even if that would lower the overall price.

Approach #1: DFS + Backtracking. [Java]

class Solution {
public int shoppingOffers(List<Integer> price, List<List<Integer>> special, List<Integer> needs) {
return shopping(price, special, needs, 0);
} public int shopping(List<Integer> price, List<List<Integer>> special, List<Integer> needs, int index) {
if (index == special.size()) {
return purchaseWithOriginalPrice(price, needs);
}
List<Integer> clone = new ArrayList<>(needs);
int i;
for (i = 0; i < special.get(index).size() - 1; ++i) {
int remain = needs.get(i) - special.get(index).get(i);
if (remain < 0) {
break;
} else {
clone.set(i, remain);
}
}
if (i == special.get(index).size() - 1) {
return Math.min(special.get(index).get(i) + shopping(price, special, clone, index),
shopping(price, special, needs, index+1));
} else {
return shopping(price, special, needs, index+1);
}
} public int purchaseWithOriginalPrice(List<Integer> price, List<Integer> needs) {
int sum = 0;
for (int i = 0; i < needs.size(); ++i) {
sum += needs.get(i) * price.get(i);
}
return sum;
}
}

  

Analysis:

The idea is very similar to combination sum. In combination sum where each element can be repeated, check each element to see if it can be used (in this case, is the sum doesn't exceed the target). If so, use it. Repeat this untill we get the result.

For this question, we check each promotion offers, if the offer can be used, use it. Repear the process and find the minimum result. In this question, the condition whether one offer can be used is the number of items in the offer doesn't exceed the needed number. Find the minimum among all combinations.

The thing to remeber, which alse happens in real life is that some special offers are actually more expensive than buying each individual item in the offers! Thus be smart and compare if buying directly is cheaper.

Reference:

https://leetcode.com/problems/shopping-offers/discuss/105212/Very-Easy-to-understand-JAVA-Solution-beats-95-with-explanation

https://github.com/ctfu/Leetcode

最新文章

  1. php 7.0 安装以及老版本php删除
  2. Highcharts中文参考手册
  3. Jdev Run Page 没有反应
  4. 清除UIWebView的缓存
  5. unittest框架的注意点
  6. spring.net 和 mybatis.net
  7. day-9
  8. 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的差别,sql文件导入
  9. Ror初学笔记
  10. Struts加入拦截器后取不到页面参数
  11. [bzoj1558][JSOI2009]等差数列
  12. python正常时间和unix时间戳时间的相互转换源码
  13. 使用ML.NET + ASP.NET Core + Docker + Azure Container Instances部署.NET机器学习模型
  14. Python 抖音机器人,论如何在抖音上找到漂亮小姐姐?
  15. Snowflake Snow Snowflakes POJ - 3349 Hash
  16. flask内容学习第三天(flak中的csrf跨站请求)
  17. django-registration
  18. [JS] JS Basic : compare with c#
  19. java中三种注释
  20. numpy教程

热门文章

  1. springmvc中@RequestMapping的使用
  2. Spring整合Struts2框架的第一种方式(Action由Struts2框架来创建)。在我的上一篇博文中介绍的通过web工厂的方式获取servcie的方法因为太麻烦,所以开发的时候不会使用。
  3. Silverlight程序设置断点无法进入调试的解决方案
  4. Python打杂之路
  5. instanceof用法及本质:
  6. geoserver 开发2
  7. 2015湖南湘潭 D 二分
  8. [原创] 分享一下Sencha 三种环境(开发环境、测试环境、生产环境)的优雅配置方案
  9. Ansible 笔记 (3) - 编写 playbook
  10. 大文件上传插件webupload插件