1. 程式人生 > >K數和問題

K數和問題

問題描述

給定n個不同的正整數(陣列num),整數k(k < = n)以及一個目標數字target。在這n個數裡面找出k個數,使得這k個數的和等於目標數字,求問有多少種方案?

解決思路

該類問題可以使用動態規劃求解。

令dp[i][j][z]表示在陣列num的【前i個元素中取j個數和為z】的組合的個數,則可得到以下遞推式:

dp[i][j][z] = dp[i-1][j][z] + dp[i-1][j-1][z-num[i]]

該遞推式的意義是:對於陣列中第i個元素,存在兩種可能性,1)選取的j個數中包含它;2)選取的j個數中不包含它。對於1),可能的組合情況數目為 dp[i-1][j][z] ;對於2)可能的組合情況的數目為 dp[i-1][j-1][z-num[i]] ,二者加起來,即為所有可能的組合的數量。

另外還注意到,i只與i-1有關,所以我們可以把三維陣列降維成二維陣列(類似於揹包問題中的降維):

dp[j][z] = dp[j][z] + dp[j-1][z-num[i]]

 程式設計練習連結:https://leetcode-cn.com/problems/3sum-with-multiplicity/description/