mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-10-31 10:26:48 +08:00 
			
		
		
		
	 a005c6ebd3
			
		
	
	a005c6ebd3
	
	
	
		
			
			* 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"请注意,该方法输出的结果包含重复集合")
 |