LintCode-k数和

给定n个不同的正整数,整数k(k < = n)以及一个目标数字。    

在这n个数里面找出K个数,使得这K个数的和等于目标数字,求问有多少种方案?

您在真实的面试中是否遇到过这个题?  Yes
样例

给出[1,2,3,4],k=2, target=5[1,4] and [2,3]2个符合要求的方案

标签 
Expand  

相关题目 
Expand 

分析:看到这种题目想肯定是动态规划问题,但是按照以往经验只想到前i个里取j个怎么怎么样(一直没处理过三维dp),看了网上的解法,可以用dp[i][j][k]表示前i个里取j个和为k的方案数,dp[i][j][k] = dp[i-1][j][k]+dp[i-1][j-1][k-A[i]],当然由于看到i只和i-1有关,所以可以进行空间上的优化,把第一维去掉,然后带有点01背包的感觉,也就是后两个循环要倒着来。

代码:

class Solution {
public:
    /**
     * @param A: an integer array.
     * @param k: a positive integer (k <= length(A))
     * @param target: a integer
     * @return an integer
     */
    int kSum(vector<int> A, int k, int target) {
        // wirte your code here
        int n = A.size();
        vector<vector<int> > dp(k+1,vector<int>(target+1,0));
        dp[0][0] = 1;
        for(auto a:A)
        {
            for(int i=k;i>=1;i--)
            {
                for(int j=target;j>=a;j--)
                {
                    dp[i][j] += dp[i-1][j-a];
                }
            }
        }
        return dp[k][target];
    }
};
    原文作者:LintCode题目解答
    原文地址: https://blog.csdn.net/wangyuquanliuli/article/details/47376653
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞