Subset-Sum Problem 子集和问题
生活随笔
收集整理的這篇文章主要介紹了
Subset-Sum Problem 子集和问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
遞歸求解子集和問題的思路
子集和問題:
給定一個集合S和一個目標值t,求問是否能從S中找出一個子集,使得這個子集元素之和等于目標值t
假設有一個集合S = {-1, 2, 7, 10},一個目標值t = 8。那么我們可以找到S的一個子集S1 = {-1, 2, 7} 各項之和等于8。
解決子集和問題的基本思路是 The inclusion/exclusion pattern,即判斷某個元素element是否應該被包含在組成目標值的子集和中。如果子集和問題有解,一般有兩種方式來處理這個元素:該元素被包含,那么集合S剩下的元素可以組成t - element ;該元素被排除,那么集合S剩下的元素可以組成t。
因此函數可寫為:
bool subsetSumExists(set<int> &s, int target){if (set.isEmpty()) {return target==0;} else {int element = s.first();set<int> rest = s - element;return subsetSumExists(rest, tartget) ||subsetSumExists(rest, target-element);} }最基本的情況是當集合為空集時,只有目標值為0才可能。后面的部分只是在重復分叉判斷某元素是否在子集和中。
這里以集合S = {-1, 2, 7, 10},目標值t = -1 為例:
總結
以上是生活随笔為你收集整理的Subset-Sum Problem 子集和问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斐波那契数列递归解法
- 下一篇: 关于C++指针的理解