Subset sum - Recover solution

倾然丶 夕夏残阳落幕 提交于 2021-01-28 09:02:58

问题


I have written a dynamic programming algorithm that finds the total amount of subsets that sum up to a target value. However, I am having trouble developing a function to recover the solution (that is, print out the actual subsets).

For example, let's take the set [1,3,5,7,9,10] with the target 13. My algorithm calculates that there are 3 subsets. The output table is shown in the image below.

Because this is a simple set, I can manually determine which three subsets make up the target. That is:

[3,10]
[1,3,9]
[1,5,7]

But, with more complicated solutions, how would I use my output table to recursively recover a solution? Any assistance is appreciated.


回答1:


Caveat

Without seeing your algorithm and any input restrictions for it (for example, are duplicate values allowed in the set?) it might not be possible to devise a method that will work for all possible cases.

It appears, however, that the following will work for all cases listed in the results table of your example. If you find that this does not work for other cases, please add those examples to your question. (I am disregarding target = 0 as a special case.)

Algorithm Sketch

Iterate through the results of the target column in ascending order.

When the result increments, you have identified another subset and have found the largest value in that subset.

To find the remaining values in the subset, "make change" the way a store clerk would. In other words, walk back down the set values, subtracting from the remaining total as you can.

Sample Run

For your given example of target sum = 13 for subsets within set [1,3,5,7,9,10]:

resultCount = 0

result(13,1) is 0; this result - resultCount = 0, so no new subsets

result(13,3) is 0; this result - resultCount = 0, so no new subsets

result(13,5) is 0; this result - resultCount = 0, so no new subsets

result(13,7) is 1; this result - resultCount = 1, so resultCount = 1
                                                     and new subset = [7]
                                                     and remaining = 13 - 7 = 6
    5 < 6, so subset = [7,5] and remaining = 6 - 5 = 1
    3 > 1, so remaining is still 1
    1 = 1, so subset = [7,5,1] and remaining = 0 (subset complete)

result(13,9) is 2; this result - resultCount = 1, so resultCount = 2
                                                     and new subset = [9]
                                                     and remaining = 13 - 9 = 4
    7 > 4, so remaining is still 4
    5 > 4, so remaining is still 4
    3 < 4, so subset = [9,3] and remaining = 4 - 3 = 1
    1 = 1, so subset = [9,3,1] and remaining = 1 - 1 = 0 (subset complete)

result(13,10) is 3; this result - resultCount = 1, so resultCount = 3
                                                      and new subset = [10]
                                                      and remaining = 13 - 10 = 3
    9 > 3, so remaining is still 3
    7 > 3, so remaining is still 3
    5 > 3, so remaining is still 3
    3 = 3, so subset = [10,3] and remaining = 3 - 3 = 0 (subset complete)

End of run with 3 subsets identified:

[7,5,1]
[9,3,1]
[10,3]


来源:https://stackoverflow.com/questions/42417352/subset-sum-recover-solution

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!