日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

638. 大礼包

發(fā)布時(shí)間:2023/11/29 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 638. 大礼包 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

638. 大禮包

在 LeetCode 商店中, 有 n 件在售的物品。每件物品都有對(duì)應(yīng)的價(jià)格。然而,也有一些大禮包,每個(gè)大禮包以優(yōu)惠的價(jià)格捆綁銷售一組物品。

給你一個(gè)整數(shù)數(shù)組 price 表示物品價(jià)格,其中 price[i] 是第 i 件物品的價(jià)格。另有一個(gè)整數(shù)數(shù)組 needs 表示購物清單,其中 needs[i] 是需要購買第 i 件物品的數(shù)量。

還有一個(gè)數(shù)組 special 表示大禮包,special[i] 的長度為 n + 1 ,其中 special[i][j] 表示第 i 個(gè)大禮包中內(nèi)含第 j 件物品的數(shù)量,且 special[i][n] (也就是數(shù)組中的最后一個(gè)整數(shù))為第 i 個(gè)大禮包的價(jià)格。

返回 確切 滿足購物清單所需花費(fèi)的最低價(jià)格,你可以充分利用大禮包的優(yōu)惠活動(dòng)。你不能購買超出購物清單指定數(shù)量的物品,即使那樣會(huì)降低整體價(jià)格。任意大禮包可無限次購買。

示例 1:輸入:price = [2,5], special = [[3,0,5],[1,2,10]], needs = [3,2] 輸出:14 解釋:有 A 和 B 兩種物品,價(jià)格分別為 ¥2 和 ¥5 。 大禮包 1 ,你可以以 ¥5 的價(jià)格購買 3A 和 0B 。 大禮包 2 ,你可以以 ¥10 的價(jià)格購買 1A 和 2B 。 需要購買 3 個(gè) A 和 2 個(gè) B , 所以付 ¥10 購買 1A 和 2B(大禮包 2),以及 ¥4 購買 2A 。 示例 2:輸入:price = [2,3,4], special = [[1,1,0,4],[2,2,1,9]], needs = [1,2,1] 輸出:11 解釋:A ,B ,C 的價(jià)格分別為 ¥2 ,¥3 ,¥4 。 可以用 ¥4 購買 1A 和 1B ,也可以用 ¥9 購買 2A ,2B 和 1C 。 需要買 1A ,2B 和 1C ,所以付 ¥4 買 1A 和 1B(大禮包 1),以及 ¥3 購買 1B , ¥4 購買 1C 。 不可以購買超出待購清單的物品,盡管購買大禮包 2 更加便宜。

提示:

  • n == price.length
  • n == needs.length
  • 1 <= n <= 6
  • 0 <= price[i] <= 10
  • 0 <= needs[i] <= 10
  • 1 <= special.length <= 100
  • special[i].length == n + 1
  • 0 <= special[i][j] <= 50

解題思路

  • 預(yù)處理special數(shù)組,如果大禮包內(nèi)所有的物品數(shù)量都為0或者大禮包的單價(jià)小于所有物品的總價(jià),則將其剔除出去。
  • 使用深度優(yōu)先搜索,每一次遞歸就是選擇任意一份大禮包,或者不購買大禮包,全部按所需物品的單價(jià)購買,計(jì)算購買該大禮包以后,仍每種物品仍然需要的數(shù)量大小,進(jìn)行下一次遞歸,如果超出購物清單指定數(shù)量的物品,則不進(jìn)行遞歸,返回最小花費(fèi)的組合方式。
  • 使用記憶化搜索,使用map記錄下,所需物品清單和其花費(fèi)最低價(jià)格的映射,避免重復(fù)計(jì)算某種所需物品清單的最低價(jià)格。
  • 代碼

    class Solution {Map<List<Integer>, Integer> map = new HashMap<>();public int shoppingOffers(List<Integer> price, List<List<Integer>> special, List<Integer> needs) {List<List<Integer>> filter = new ArrayList<>();for (List<Integer> integerList : special) {int sum = 0, c = 0;for (int i = 0; i < integerList.size() - 1; i++) {sum += price.get(i) * integerList.get(i);c += integerList.get(i);}if (integerList.get(integerList.size() - 1) < sum && c > 0)filter.add(integerList);}return dfs(price, needs, filter);}public int dfs(List<Integer> price, List<Integer> needs, List<List<Integer>> special) {if (map.containsKey(needs)) {return map.get(needs);}int p = 0, n = needs.size();for (int i = 0; i < needs.size(); i++) {p += needs.get(i) * price.get(i);}for (List<Integer> spec : special) {ArrayList<Integer> next = new ArrayList<>();for (int i = 0; i < n; i++) {if (spec.get(i) > needs.get(i)) {break;}next.add(needs.get(i) - spec.get(i));}if (next.size() == n)p = Math.min(p, spec.get(n) + dfs(price, next, special));}map.put(needs, p);return p;}}

    總結(jié)

    以上是生活随笔為你收集整理的638. 大礼包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。