kSum,实现方式,动态规划
生活随笔
收集整理的這篇文章主要介紹了
kSum,实现方式,动态规划
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
kSum
關于3Sum可以,先遍歷第一個數,剩下的和求2Sum
對于kSum的問題,很容易想到使用動態規劃,問題規模由3個方面:元素個數n,kSum的k,以及目標target
狀態方程為:dp[n][k][target] = dp[n-1][k-1][target-arr[n]] (選第n個數)+ dp[n-1][k][target](不選第n個數)
為可能性問題,最后必須裝滿,也就是k=0時,target =0才能時找到了一個方案,所以dp[n][k][target] = dp[n-1][k-1][target-arr[n]] or dp[n-1][k][target]
import numpy as np def kSum(arr,target,k):n = len(arr)dp = np.full((n+1,k+1,target+1),False)# 初始化,為可能性問題,也就是最后必須k和target都用完了,才是最后的解# 不能使用dp[:][0][0] = True,這兩個的賦值不一樣,這里是一個容易出錯的地方for i in range(n+1):dp[i][0][0] = Truefor i in range(1,n+1):for j in range(1,k+1):# 這里是一個剪枝,假如k小于元素個數就沒有必要考慮了if j <= i:for l in range(1,target+1):# 注意邊界,假如l-arr[i-1]<0,就沒有意義了,只能取左邊if l-arr[i-1] >=0:dp[i][j][l] = dp[i-1][j][l] or dp[i-1][j-1][l-arr[i-1]]else:dp[i][j][l] = dp[i-1][j][l]return dp[n][k][target]arr = [16,7,8,44,2,4,5,97,5,3] print(kSum(arr,99,3)) print(kSum(arr,102,3))False True總結
以上是生活随笔為你收集整理的kSum,实现方式,动态规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TwoSum,从O(n^2)到O(nlo
- 下一篇: 合并数组:双针模型,原地实现