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