สมมติว่ามีร้านค้า มีสินค้าบางอย่างที่จะขาย แต่ละรายการมีราคาบางส่วน อย่างไรก็ตาม มีข้อเสนอพิเศษบางอย่าง และข้อเสนอพิเศษประกอบด้วยสินค้าประเภทต่าง ๆ หนึ่งชนิดขึ้นไปที่มีราคาลด เราจึงมีรายการราคา ชุดข้อเสนอพิเศษ และจำนวนที่เราต้องซื้อสำหรับแต่ละรายการ งานคือการหาราคาต่ำสุดที่เราต้องจ่ายสำหรับสินค้าบางรายการตามที่กำหนด ซึ่งเราสามารถใช้ประโยชน์จากข้อเสนอพิเศษได้อย่างเหมาะสมที่สุด
ในที่นี้ข้อเสนอพิเศษแต่ละรายการจะแสดงในรูปแบบของอาร์เรย์ ตัวเลขสุดท้ายคือราคาที่เราต้องจ่ายสำหรับข้อเสนอพิเศษนี้ ตัวเลขอื่นๆ แสดงถึงจำนวนรายการเฉพาะที่เราจะได้รับหากเราซื้อข้อเสนอพิเศษนี้
ดังนั้นหากอินพุตเป็น [2,5], [[3,0,5], [1,2,10]] และ [3,2] ผลลัพธ์จะเป็น 14 เนื่องจากมีสองประเภท ของสินค้า A และ B ราคาอยู่ที่ $2 และ $5 ตามลำดับ ในข้อเสนอพิเศษ 1 เราสามารถจ่าย $5 สำหรับ 3A และ 0B ในข้อเสนอพิเศษ 2 เราสามารถจ่าย $10 สำหรับ 1A และ 2B เราจำเป็นต้องซื้อ 3A และ 2B ดังนั้นเราอาจจ่าย $10 สำหรับ 1A และ 2B (ข้อเสนอพิเศษ 2) และ $4 สำหรับ 2A
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดแผนที่ที่เรียกว่าบันทึก
-
กำหนดวิธีการที่เรียกว่า directPurchase() ซึ่งใช้ราคาและต้องการอาร์เรย์
-
ยกเลิก :=0
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของอาร์เรย์ราคา – 1
-
ret :=ret + ราคา[i] * ต้องการ[i]
-
-
รีเทิร์น
-
กำหนดวิธีการช่วยเหลือหนึ่งวิธี สิ่งนี้จะใช้อาร์เรย์ราคา เมทริกซ์ข้อเสนอพิเศษ ความต้องการอาร์เรย์ และดัชนี -
-
หากบันทึกมีความต้องการ ให้ส่งคืนบันทึก[ต้องการ]
-
ret :=directPurchase(ราคา ต้องการ)
-
สำหรับฉันอยู่ในช่วงดัชนีจำนวนแถวของเมทริกซ์ข้อเสนอพิเศษ – 1
-
ถ้าต้องการ[j] <พิเศษ[i, j] ให้ตั้งค่า ok :=false และออกจากลูป
-
ใส่ need[j] – พิเศษ[i, j] ลงใน temp array
-
-
ถ้าตกลงเป็นจริงแล้ว
-
op1 :=องค์ประกอบคอลัมน์สุดท้ายของ special[i] + helper(price, special, temp, i)
-
ret :=ขั้นต่ำของ ret และ op1
-
-
บันทึก[needs] :=ret และ return
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
ผู้ช่วยคืนสินค้า(ราคา พิเศษ ความต้องการ 0)
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: map <vector <int> , int> memo; int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) { return helper(price, special, needs, 0); } int helper(vector <int>& price, vector < vector <int> >& special, vector <int>& needs, int idx){ if(memo.count(needs)) return memo[needs]; int ret = directPurchase(price, needs); for(int i = idx; i < special.size(); i++){ vector <int> temp; bool ok = true; for(int j = 0; j < special[i].size() - 1; j++){ if(needs[j] < special[i][j]) { ok = false; break; } temp.push_back(needs[j] - special[i][j]); } if(ok){ int op1 = special[i][special[i].size() - 1] + helper(price, special, temp, i); ret = min(ret, op1); } } return memo[needs] = ret; } int directPurchase(vector <int>& price, vector <int>& needs){ int ret = 0; for(int i = 0; i < price.size(); i++){ ret += price[i] * needs[i]; } return ret; } }; main(){ vector<int> v1 = {2,5}; vector<vector<int>> v2 = {{3,0,5},{1,2,10}}; vector<int> v3 = {3,2}; Solution ob; cout << (ob.shoppingOffers(v1, v2, v3)); }
อินพุต
[2,5] [[3,0,5],[1,2,10]] [3,2]
ผลลัพธ์
14