สมมุติว่าเรามีเหรียญหลายนิกายและจำนวนเงินทั้งหมด เราต้องเขียนโมดูลเพื่อคำนวณจำนวนชุดค่าผสมที่รวมกันเป็นจำนวนนั้น เราสามารถสรุปได้ว่าเรามีจำนวนเหรียญแต่ละชนิดเป็นอนันต์ ดังนั้นหากจำนวนเท่ากับ 5 และเหรียญเป็น [1, 2, 5] แสดงว่ามีสี่ชุดค่าผสม (1+1+1+1+1), (1+1+1+2), (1+2+2), (5)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างหนึ่งอาร์เรย์ dp ของจำนวนขนาด + 1
- dp[0] :=1
- n :=ขนาดของอาร์เรย์เหรียญ
- สำหรับ i ในช่วง 0 ถึง n – 1
- สำหรับ j ในช่วง coins[i] ถึงจำนวน
- dp[j] :=dp[j – coins[i]]
- สำหรับ j ในช่วง coins[i] ถึงจำนวน
- คืน dp[จำนวน]
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น −
#include <bits/stdc++.h> using namespace std; class Solution { public: int change(int amount, vector<int>& coins) { vector <int> dp(amount + 1); dp[0] = 1; int n = coins.size(); for(int i = 0; i < n; i++){ for(int j = coins[i]; j <= amount; j++){ dp[j] += dp[j - coins[i]]; } } return dp[amount]; } }; main(){ Solution ob; vector<int> v = {1,2,5}; cout << (ob.change(5, v)); }
อินพุต
5 [1,2,5]
ผลลัพธ์
4