mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 14:18:20 +08:00 
			
		
		
		
	* Update avatar's link in the landing page * Bug fixes * Move assets folder from overrides to docs * Reduce figures' corner radius * Update copyright * Update header image * Krahets -> krahets * Update the landing page
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						||
File: subset_sum_i_naive.py
 | 
						||
Created Time: 2023-06-17
 | 
						||
Author: krahets (krahets@163.com)
 | 
						||
"""
 | 
						||
 | 
						||
 | 
						||
def backtrack(
 | 
						||
    state: list[int],
 | 
						||
    target: int,
 | 
						||
    total: int,
 | 
						||
    choices: list[int],
 | 
						||
    res: list[list[int]],
 | 
						||
):
 | 
						||
    """回溯算法:子集和 I"""
 | 
						||
    # 子集和等于 target 时,记录解
 | 
						||
    if total == target:
 | 
						||
        res.append(list(state))
 | 
						||
        return
 | 
						||
    # 遍历所有选择
 | 
						||
    for i in range(len(choices)):
 | 
						||
        # 剪枝:若子集和超过 target ,则跳过该选择
 | 
						||
        if total + choices[i] > target:
 | 
						||
            continue
 | 
						||
        # 尝试:做出选择,更新元素和 total
 | 
						||
        state.append(choices[i])
 | 
						||
        # 进行下一轮选择
 | 
						||
        backtrack(state, target, total + choices[i], choices, res)
 | 
						||
        # 回退:撤销选择,恢复到之前的状态
 | 
						||
        state.pop()
 | 
						||
 | 
						||
 | 
						||
def subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]:
 | 
						||
    """求解子集和 I(包含重复子集)"""
 | 
						||
    state = []  # 状态(子集)
 | 
						||
    total = 0  # 子集和
 | 
						||
    res = []  # 结果列表(子集列表)
 | 
						||
    backtrack(state, target, total, nums, res)
 | 
						||
    return res
 | 
						||
 | 
						||
 | 
						||
"""Driver Code"""
 | 
						||
if __name__ == "__main__":
 | 
						||
    nums = [3, 4, 5]
 | 
						||
    target = 9
 | 
						||
    res = subset_sum_i_naive(nums, target)
 | 
						||
 | 
						||
    print(f"输入数组 nums = {nums}, target = {target}")
 | 
						||
    print(f"所有和等于 {target} 的子集 res = {res}")
 | 
						||
    print(f"请注意,该方法输出的结果包含重复集合")
 |