题目:
给定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 > 0),...
对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数 最小的删数方案。 «编程任务: 对于给定的正整数a,编程计算删去k个数字后得到的最小数。 Input 由文件input.txt提供输入数据。文件的第1...
本文件给出了一种不同角度的在一个数组中找第k小的数,特别是在大型数据里有较快的速度(本算法给出的是20个数)。
现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。 此题请勿采用将序列X和Y合并找第k小的O(m+n)的一般方法,要充分利用X和Y已经排好序的这一特性。 输入格式 第一行有三个数,...
在计算机科学和数学中,计算从n个正整数中选择k个数的不同组合数是一项基本的任务,这涉及到组合数学中的组合(Combination)概念。组合是指从一个集合中不考虑顺序取出k个元素的方法数,它与排列(Permutation)...
### 寻找最大的K个数的关键知识点解析 #### 一、问题背景与基本思路 在IT面试场景中,“寻找最大的K个数”是一个常见的算法题目。该问题要求从大量无序数字中找到最大的K个数。这个问题看似简单,但实际上包含了多...
k进制数转化为十进制数,输入一个k进制的数(你需要输入k的值,告诉程序你输入的是几进制的数)程序输出的是一个十进制数,供初学者练习编程的简单算法
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。...随着L和K的变大,这个K数目很大,请你输出它对1000000007取模后的值为。
# 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 # 示例: # 输入: n = 4, k = 2 # 输出: # [ # [2,4], # [3,4], # [2,3], # [1,2], # [1,3], # [1,4], # ]
k个接近中位数的数
c语言求N个数中第K大的值,采用改进型快排
综上所述,VMD的中心频率对于确定分解个数K至关重要,它关系到信号分解的质量和后续分析的可靠性。选择合适的K值需要结合具体的应用场景,通过多种方法综合考虑,包括试错法、能量分布、熵值、残差误差以及统计指标...
分治法求第k小的数分治法求第k小的数分治法求第k小的数分治法求第k小的数
利用分治法,解决对N个字中求第K大的数字的问题,效率比起逐个扫描有素提高
基于快排的查找来得到N个数中第K大的数,时间复杂度为O(KlogN)
标题 "K好数_C语言_sus404_K._nearbyndd_K好数_源码.zip" 提供的信息表明,这是一个与C语言编程相关的项目,重点在于理解和实现"K好数"的概念。"K好数"可能是指在某个特定上下文中具有特定性质或满足特殊条件的数字...
输入一个N位高精度的正整数,去掉其中任意K个数字后剩下的数字...写算法对给定的N和K,寻找一种方案使得剩下的数字组成的新数最小。 输入:N、K以及一个N位高精度的正整数 输出:剩下的数字组成的最小新数 如下图所示:
给定一数组,查找数组中第k大的数。代码中借助快速排序中的partition方法来实现。
12有一个数组arr,其中只有一种数出现了K次,其余所有的数都都出现了M次。