สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums และอีกค่าหนึ่งคือ k เราต้องตรวจสอบว่าเป็นไปได้หรือไม่ที่จะแบ่ง nums ออกเป็น k ชุดย่อยต่างๆ โดยที่ผลรวมของแต่ละชุดย่อยจะเท่ากัน
ดังนั้น หากอินพุตเป็น nums =[4, 2, 6, 5, 1, 6, 3] k =3 ผลลัพธ์จะเป็น True เนื่องจากเราสามารถแบ่งพาร์ติชั่นได้ดังนี้ [6, 3], [6 , 2, 1], และ [4, 5].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน check() ซึ่งจะใช้อาร์เรย์ v
- สำหรับการเริ่มต้น i :=1 เมื่อ i <ขนาด v อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- ถ้า v[i] ไม่เท่ากับ v[0] แล้ว −
- คืนค่าเท็จ
- ถ้า v[i] ไม่เท่ากับ v[0] แล้ว −
- คืนค่าจริง
- กำหนดฟังก์ชัน dfs() ซึ่งจะใช้ idx, หมายเลขอาร์เรย์, อุณหภูมิอาร์เรย์
- ถ้า idx เท่ากับขนาดของ nums แล้ว −
- เช็คคืน(ชั่วคราว)
- ret :=false
- สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของ temp อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- temp[i] :=temp[i] + nums[idx]
- ret :=dfs(idx + 1, nums, temp)
- ถ้า ret เป็นจริง ดังนั้น −
- คืนค่าจริง
- temp[i] :=temp[i] - nums[idx]
- คืนค่าเท็จ
- จากวิธีหลัก ให้ทำดังนี้ -
- กำหนดอุณหภูมิอาร์เรย์ขนาด k
- คืนค่า dfs(0, nums, temp)
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool check(vector<int>& v) {
for (int i = 1; i < v.size(); i++) {
if (v[i] != v[0])
return false;
}
return true;
}
bool dfs(int idx, vector<int>& nums, vector<int>& temp) {
if (idx == nums.size()) {
return check(temp);
}
bool ret = false;
for (int i = 0; i < temp.size(); i++) {
temp[i] += nums[idx];
ret = dfs(idx + 1, nums, temp);
if (ret)
return true;
temp[i] -= nums[idx];
}
return false;
}
bool solve(vector<int>& nums, int k) {
vector<int> temp(k);
return dfs(0, nums, temp);
}
};
bool solve(vector<int>& nums, int k) {
return (new Solution())->solve(nums, k);
}
int main(){
vector<int> v = {4, 2, 6, 5, 1, 6, 3};
int k = 3;
cout << solve(v, 3);
} อินพุต
{4, 2, 6, 5, 1, 6, 3}, 3 ผลลัพธ์
1