问题描述

给定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-1][z-num[i]];对于2)可能的组合情况的数目为  dp[i-1][j][z]  ,二者加起来,即为所有可能的组合的数量。

另外还注意到,i只与i-1有关,所以我们可以把三维数组降维成二维数组(类似于背包问题中的降维):

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

 编程练习链接:https://leetcode-cn.com/problems/3sum-with-multiplicity/description/

posted on 2018-12-19 21:39  飘涧雪  阅读(284)  评论(0编辑  收藏  举报