`

K数和

阅读更多

题目:

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

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

样例

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

解题思路,看到这道题,很明显就是使用动态规划的办法,是01背包变种,我们按照01背包的思路,把原来的二维数组改成三维数组即可:f[i][k][target] = f[i-1][k][target] + f[i-1][k-1][target-arr[i]];我们总结这个公式可以发现,全局和第一维i是没有逻辑上的关系的,此时我们可以把其优化为二维数组,代码如下:
package lintcode;

import java.util.Scanner;

/**
 * Created by Taoyongpan on 2017/11/15.
 * 给定 n 个不同的正整数,整数 k(k < = n)以及一个目标数字。在这 n 个数里面找出 k 个数,
 * 使得这 k 个数的和等于目标数字,写一个函数实现找到不同的方案的数量。
 */
public class SumOfK {

    //随机产生数组
    public static int[] generateRandomArray(int maxSize, int maxValue){
        if (maxSize<=0){
            return null;
        }
        int[] arr = new int[(int) ((maxSize+1)*Math.random())];
        for (int i = 0 ; i<arr.length;i++){
            arr[i] = (int) ((maxValue+1)*Math.random());
        }
        return arr;
    }

    public static int sum(int[] arr,int k,int target){
        int n = arr.length;
        int num = 0 ;

        if (k<0||k>n){
            return num;
        }
        int[][] f = new int[k+1][target+1];
        f[0][0] = 1;
        //f[i][k][target] = f[i-1][k][target] + f[i-1][k-1][target-arr[i]]
        for (int i = 0; i < n; i++){
            for (int j = k ; j >= 1;j--){
                for (int s = target ; s >= arr[i] ; s--){
                    f[j][s] = f[j][s]+f[j-1][s-arr[i]];
                }
            }
        }
        return f[k][target];
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        while (sc.hasNext()){
            int maxSize = 10;//随机产生数组的最大规格
            int maxValve = 50 ;//随机数组的最大值
            int[] arr = {1,2,3,4};
            int k = sc.nextInt();
            int target = sc.nextInt();
            System.out.println(sum(arr,k,target));

        }
    }
}
 
分享到:
评论

相关推荐

    K尾相等数

    ### K尾相等数知识点解析 #### 一、概念理解 **K尾相等数**是一种特殊的数值计算问题,主要关注于某个整数k的幂次方运算后得到的结果的末几位数字是否出现周期性重复的现象。具体而言,对于一个整数k(k &gt; 0),...

    删数问题给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个

    对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数 最小的删数方案。 «编程任务: 对于给定的正整数a,编程计算删去k个数字后得到的最小数。 Input 由文件input.txt提供输入数据。文件的第1...

    找第k小的数

    本文件给出了一种不同角度的在一个数组中找第k小的数,特别是在大型数据里有较快的速度(本算法给出的是20个数)。

    17082 两个有序数序列中找第k小

    现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。 此题请勿采用将序列X和Y合并找第k小的O(m+n)的一般方法,要充分利用X和Y已经排好序的这一特性。 输入格式 第一行有三个数,...

    用递归法计算从n个正整数中选择k个数的不同组合数

    在计算机科学和数学中,计算从n个正整数中选择k个数的不同组合数是一项基本的任务,这涉及到组合数学中的组合(Combination)概念。组合是指从一个集合中不考虑顺序取出k个元素的方法数,它与排列(Permutation)...

    寻找最大的K个数

    ### 寻找最大的K个数的关键知识点解析 #### 一、问题背景与基本思路 在IT面试场景中,“寻找最大的K个数”是一个常见的算法题目。该问题要求从大量无序数字中找到最大的K个数。这个问题看似简单,但实际上包含了多...

    02-k进制数转化为十进制.py

    k进制数转化为十进制数,输入一个k进制的数(你需要输入k的值,告诉程序你输入的是几进制的数)程序输出的是一个十进制数,供初学者练习编程的简单算法

    K好数_C语言_sus404_K._nearbyndd_K好数_

    如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。...随着L和K的变大,这个K数目很大,请你输出它对1000000007取模后的值为。

    python 实现给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合

    # 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 # 示例: # 输入: n = 4, k = 2 # 输出: # [ # [2,4], # [3,4], # [2,3], # [1,2], # [1,3], # [1,4], # ]

    k个接近中位数的数

    k个接近中位数的数

    N个数求第K大

    c语言求N个数中第K大的值,采用改进型快排

    变分模态分解(VMD)通过中心频率确定分解个数K

    综上所述,VMD的中心频率对于确定分解个数K至关重要,它关系到信号分解的质量和后续分析的可靠性。选择合适的K值需要结合具体的应用场景,通过多种方法综合考虑,包括试错法、能量分布、熵值、残差误差以及统计指标...

    分治法求第k个小的数

    分治法求第k小的数分治法求第k小的数分治法求第k小的数分治法求第k小的数

    分治法求第K大的数字

    利用分治法,解决对N个字中求第K大的数字的问题,效率比起逐个扫描有素提高

    求N个数中第K大的数

    基于快排的查找来得到N个数中第K大的数,时间复杂度为O(KlogN)

    K好数_C语言_sus404_K._nearbyndd_K好数_源码.zip

    标题 "K好数_C语言_sus404_K._nearbyndd_K好数_源码.zip" 提供的信息表明,这是一个与C语言编程相关的项目,重点在于理解和实现"K好数"的概念。"K好数"可能是指在某个特定上下文中具有特定性质或满足特殊条件的数字...

    单链表 贪心算法去掉任意K个数最小

    输入一个N位高精度的正整数,去掉其中任意K个数字后剩下的数字...写算法对给定的N和K,寻找一种方案使得剩下的数字组成的新数最小。 输入:N、K以及一个N位高精度的正整数 输出:剩下的数字组成的最小新数 如下图所示:

    查找数组中第k大的数

    给定一数组,查找数组中第k大的数。代码中借助快速排序中的partition方法来实现。

    新的K-均值算法最佳聚类数确定方法

    ### 新的K-均值算法最佳聚类数确定方法 #### 概述 在数据挖掘与机器学习领域中,K-均值算法是一种非常流行的无监督学习方法,主要用于聚类分析。该算法通过将数据集划分为多个聚类(或组),使得每个数据点都属于...

Global site tag (gtag.js) - Google Analytics