K数和问题

Leetcode上有一个系列的问题

  1. 在一个数组中找寻2个数的和值为target
  2. 在一个数组中找寻3个数的和值为target
  3. 在一个数组中找寻4个数的和值为target
    在一个给定的数组A中找寻k个数,使其值等于target,一共有多少种方案。

这道题用DP来做。
result[i][j][target]
i表示数组的大小。j 标识找寻多少个值。k标识目标值。A表示给定数组。
所有有

result[i][j][target] = result[i - 1][j - 1][target - A[i]]  + result[i - 1][j][target];

站在i的位置考虑,即考虑是否需要i位的值。
result[i - 1][j][target] 表示不需要i位的值
result[i - 1][j - 1][target - A[i]] 表示需要i位的值

    public int kSum(int[] A, int k, int target) {
        int result[][][] = new int[A.length + 1][k + 1][target + 1];
        for (int i = 0; i < A.length + 1; i++) {
            result[i][0][0] = 1;
        }
        for (int h = 1; h < A.length + 1 ; h++) {
            int min = Math.min(h, k);
            for (int i = 1; i <= min; i++) {
                for (int j = 1; j <= target; j++) {
                    if(j >= A[h - 1]) {
                        result[h][i][j] = result[h - 1][i][j] + result[h - 1][i - 1][j - A[h- 1]];
                    }else {
                        result[h][i][j] = result[h - 1][i][j];
                    }
                }
            }
        }
        printNums(result[A.length], k + 1, target +1);
        return result[A.length ][k][target];
    }

另外有一种比较简便的方法:
参考 https://www.jianshu.com/p/e5a6d7c356e6
不过我看不太懂怎么从3维简化成了一位。以及倒序便利。。。惭愧……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,402评论 0 2
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 4,068评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 9点48分,小家伙终于在第七本幼儿绘本的故事中甜甜睡去。我也口干舌燥,算算时间,每本书读大约六分钟,也四十多分钟了...
    幸福鸟_350e阅读 166评论 0 1
  • 在电影《后会无期》里,韩寒说,“听过很多道理,依然过不好这一生”。这句话炸开了很多人的心锅,刷爆了很多人的朋友圈。...
    朝久晚悟阅读 356评论 2 1